Bashスクリプトを作成しましたが、実行しようとすると、
#!/bin/bash no such file or directory
次のコマンドを実行する必要があります:bash script.sh
動作します。
どうすれば修正できますか?
この種のメッセージは通常、最初の行の終わりに余分なキャリッジリターンまたは最初の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
(またはsed
、tr
、awk
、Perl
、python
…)これが問題である場合にスクリプトを修正します。
以下は、BOMとテーリングCRの両方を削除するものです。
sed -i '1s/^.*#//;s/\r$//' brokenScript
ここでは、名前(echo $0
)および次のそれぞれのシバン行があります:
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
これは、UTF-8スクリプトのBOMが原因で発生する場合もあります。 Windowsでスクリプトを作成すると、ファイルの先頭に迷惑メールが入ることがあります。
両方の問題が存在する場合は、viを使用して修正できます。
vi <your_file>
:set ff=unix
:set nobomb
:wq
実際、bashスクリプトの正しいシバンは次のとおりです。
#!/usr/bin/env bash
FreeBSDでは、bashは/usr/local/bin/bash
にあるためです。
Dos2unixがない場合、これはこの問題を修正する方法です。
cp script _p4 && tr -d '\r' < _p4 > script && rm _p4
これはBOMが原因である可能性があります。ウィキペディアから、BOMは
バイトオーダーマーク(BOM)はUnicode文字、U + FEFFバイトオーダーマーク(BOM)であり、テキストストリームの開始時にマジックナンバーとして出現することで、テキストを消費するプログラムにいくつかの信号を送ることができます。
残念ながら、 シバン行を処理するLinuxカーネルには何も通知しません。file
、
file /tmp/foo
/tmp/foo: UTF-8 Unicode (with BOM) text
または、最初の数文字を16進ダンプし、BOM文字のいずれかに手動で一致するかどうか を確認できます
このようにわかったら、BOMキャラクターを取り除くことができます。
sed -i '1 s/^\xef\xbb\xbf//' *.txt
誤ってPATH
に誤ったbash実行可能ファイルを追加することで問題が発生しました。また、スクリプトでより柔軟な#!/usr/bin/env bash
Shebangが使用されたため(パスから最初のbash実行可能ファイルを取得)。
command -v bash
/cygdrive/c/Program Files/Git/bin//bash
Windows GIT GUIと一緒にcygwin
で動作するようにGIT for Windowsをインストールしました(cygwinネイティブgit ...では動作しませんでした)。 #!/bin/bash
shebandに切り替えて、PATH
からウィンドウのGITを削除することで、これを解決しました。