bashスクリプトを作成しましたが、実行しようとすると、
#!/bin/bash no such file or directory
コマンドを実行する必要があります:bash script.sh
それが機能するために。
どうすれば修正できますか?
#!/usr/bin/env bash
代わりに#!/bin/bash
...ここに見ても
bashスクリプトを作成しましたが、実行しようとすると、
#!/bin/bash no such file or directory
コマンドを実行する必要があります:bash script.sh
それが機能するために。
どうすれば修正できますか?
#!/usr/bin/env bash
代わりに#!/bin/bash
...ここに見ても
回答:
通常、この種のメッセージは、最初の行の終わりに余分な改行があるか、最初の行に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
)を表示するだけで、それぞれ次のシバン行を持つ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
hexdump -C yourscript | head -n 1
。私はまだdos2unix yourscript
それを修正するために使用します。
#!/bin/bash no such file or directory
エラーメッセージは表示されません。何も実行またはオープンを試行する理由がないため#!/bin/bash
です。それ/bin/bash<CR>
は実行されるものです。
dos2unix
UTF-8 BOMも削除します。UTF-8 BOMがエラーメッセージを説明した可能性があります。
これは、UTF-8スクリプトのBOMによっても発生する可能性があります。Windowsでスクリプトを作成すると、ファイルの冒頭で迷惑メールが発生することがあります。
実際、bashスクリプトに適したシバンは次のとおりです。
#!/usr/bin/env bash
なぜなら、freeBSDでは、bashは /usr/local/bin/bash
両方の問題が存在する場合は、viを使用して修正できます。
vi <your_file>
:set ff=unix
:set nobomb
:wq
これは、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
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/bash
shebandに切り替えてWindowsのGITをから削除することでこれを解決しましたPATH
。