#!/ bin / bash-そのようなファイルまたはディレクトリはありません


70

bashスクリプトを作成しましたが、実行しようとすると、

#!/bin/bash no such file or directory

コマンドを実行する必要があります:bash script.shそれが機能するために。

どうすれば修正できますか?


私はこの問題をcygwinの下で、すでに問題なく実行されていると断言できるスクリプトを使用して問題を抱えています。すべての回答を確認しましたが、当てはまるものはありません。他の質問と回答も32/64ビットの問題に言及していましたが、シェルスクリプトの場合、これは除外されますよね?
1月

、その理由を発見した新しいanwerの中に詳細を追加unix.stackexchange.com/a/450389/62636誰かがまたを使用した場合に#!/usr/bin/env bash代わりに#!/bin/bash...ここに見ても
1月

回答:


100

通常、この種のメッセージは、最初の行の終わりに余分な改行があるか、最初の行にBOMがある偽のシバン行に起因します。

実行:

$ head -1 yourscript | od -c

そしてそれがどのように終わるかを見てください。

これは間違っています:

0000000   #   !   /   b   i   n   /   b   a   s   h  \r  \n

これも間違っています:

0000000 357 273 277   #   !   /   b   i   n   /   b   a   s   h  \n

これは正しいです:

0000000   #   !   /   b   i   n   /   b   a   s   h  \n

使用するdos2unix(またはsedtrawkperlpythonこれが問題になる場合、スクリプトを修正するために...)。

BOMと末尾のCRの両方を削除するものを次に示します。

sed -i '1s/^.*#//;s/\r$//' brokenScript


スクリプトの実行に使用しているシェルは、表示されるエラーメッセージにわずかに影響することに注意してください。

以下は、名前(echo $0)を表示するだけで、それぞれ次のシバン行を持つ3つのスクリプトです。

correctScript:

0000000   #   !   /   b   i   n   /   b   a   s   h  \n

scriptWithBom:

0000000 357 273 277   #   !   /   b   i   n   /   b   a   s   h  \n

scriptWithCRLF:

0000000   #   !   /   b   i   n   /   b   a   s   h  \r  \n

bashの下で実行すると、次のメッセージが表示されます。

$ ./correctScript
./correctScript
$ ./scriptWithCRLF
bash: ./scriptWithCRLF: /bin/bash^M: bad interpreter: No such file or directory
$ ./scriptWithBom
./scriptWithBom: line 1: #!/bin/bash: No such file or directory
./scriptWithBom

インタプリタを明示的に呼び出して偽のスクリプトを実行すると、CRLFスクリプトを問題なく実行できます。

$ bash ./scriptWithCRLF
./scriptWithCRLF
$ bash ./scriptWithBom
./scriptWithBom: line 1: #!/bin/bash: No such file or directory
./scriptWithBom

以下に、観察される動作を示しますksh

$ ./scriptWithCRLF
ksh: ./scriptWithCRLF: not found [No such file or directory]
$ ./scriptWithBom
./scriptWithBom[1]: #!/bin/bash: not found [No such file or directory]
./scriptWithBom

以下dash

$ ./scriptWithCRLF
dash: 2: ./scriptWithCRLF: not found
$ ./scriptWithBom
./scriptWithBom: 1: ./scriptWithBom: #!/bin/bash: not found
./scriptWithBom

2
これが問題であるかどうかを明らかにする別の方法はであるhexdump -C yourscript | head -n 1。私はまだdos2unix yourscriptそれを修正するために使用します。
ケビンM

はい、それは非常にうまくいく可能性があります。Windowsで編集しました。先端のためのもの。
ニコラスデフォントネ

1
CRLFの問題の場合、#!/bin/bash no such file or directoryエラーメッセージは表示されません。何も実行またはオープンを試行する理由がないため#!/bin/bashです。それ/bin/bash<CR>は実行されるものです。
ステファンシャゼル14年

1
@StephaneChazelas dos2unixが問題を修正したので、CRLFの問題ではなかったことに疑いの余地はありません。エラーメッセージはおそらく不正確に転写されただけ
でした

6
dos2unixUTF-8 BOMも削除します。UTF-8 BOMがエラーメッセージを説明した可能性があります。
ステファンシャゼル14年

17

これは、UTF-8スクリプトのBOMによっても発生する可能性があります。Windowsでスクリプトを作成すると、ファイルの冒頭で迷惑メールが発生することがあります。


BOMは、同様に、AWKを用いて容易に除去することができるstackoverflow.com/questions/1068650/...
pauxu

1
Visual Studio for MacがBOMを挿入することに注意してください。
18年

9

実際、bashスクリプトに適したシバンは次のとおりです。

#!/usr/bin/env bash

なぜなら、freeBSDでは、bashは /usr/local/bin/bash


13
「正しい」というのは、そのような場合に使うのが難しい言葉です。おそらく、より良いフレーズは「エラーが発生しにくい」でしょう。
HalosGhost 14年

1
これもひどいです。/ usrが存在するという仮定は悪いIMOです。たとえば、Haikuには/ usrがありません。
ジェシカ

9

両方の問題が存在する場合は、viを使用して修正できます。

vi <your_file>
:set ff=unix
:set nobomb
:wq

回答は可能な限り自己完結型である必要があります。この質問では、2つの問題に言及していません。他の答えに基づいて構築する場合は、少なくともその答えを言う必要があります。さらに良いことに、これが質問にどのように答えるを説明する必要があります。
Gマン

Windowsツールをダウンロードしなくても非常に簡単に修正できます、ありがとう!
蒸気で駆動

1
@ G-Man他の回答では、これについては、私が説明したいよりもはるかに詳細に説明しています。繰り返す必要はありませんが、痛いほど明らかでない場合は、Windowsの行末と非表示のWindows BOM文字を使用できます。答えをスキャンしている多くの人は、特に他の答えにもっと詳細がある場合、自己完結ではなく簡潔さを高く評価しています。
-cwash

4

dos2unixがない場合、これはこの問題を解決する方法です。

cp script _p4 && tr -d '\r' < _p4 > script && rm _p4

3

バイトオーダーマーク(BOM)

これは、BOMが原因である可能性があります。ウィキペディアから、BOMは

バイトオーダーマーク(BOM)はUnicode文字であるU + FEFFバイトオーダーマーク(BOM)であり、テキストストリームの開始時にマジックナンバーとして表示されるため、テキストを消費するプログラムにいくつかのことを通知できます。

残念ながら、シバンのラインを処理するLinuxカーネルには何も通知しません。を使用して、BOMがあることを確認できますfile

file /tmp/foo 
/tmp/foo: UTF-8 Unicode (with BOM) text

または、最初の数文字を16進ダンプして、BOM文字のいずれかと手動で一致するかどうかを確認できます

このようにわかったら、BOM文字を削除できます。

sed -i '1 s/^\xef\xbb\xbf//' *.txt

0

PATH私のスクリプトでは、より柔軟な#!/usr/bin/env bashシバンが使用されていたため、間違ったbash実行可能ファイルを誤って追加して問題が発生しました(パスから最初のbash実行可能ファイルを取得します)。

command -v bash
/cygdrive/c/Program Files/Git/bin//bash

GIT for Windowsをインストールしcygwinて、Windows GIT GUIと連携するようにしました(cygwinネイティブgitでは機能しませんでした...)。私は今、#!/bin/bashshebandに切り替えてWindowsのGITをから削除することでこれを解決しましたPATH


-3

試して #!/bin/bash

2番目:find / -name bash
3番目:ls -al /bin/bash


または単にwhich bash。で動作しているため、1つを見つけていることがわかりbash script.shます。
ケビン

本当です。また、前述のように、プログラムにbash(または他のインタープリター)を検索させる、より移植性の高い/ usr / bin / envメソッドがあります。Pahをハードコーディングする必要はありません。
ヘネス14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.