web-dev-qa-db-ja.com

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

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

#!/bin/bash no such file or directory

次のコマンドを実行する必要があります:bash script.sh動作します。

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

76

この種のメッセージは通常、最初の行の終わりに余分なキャリッジリターンまたは最初の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)および次のそれぞれのシバン行があります:

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
108
jlliagre

これは、UTF-8スクリプトのBOMが原因で発生する場合もあります。 Windowsでスクリプトを作成すると、ファイルの先頭に迷惑メールが入ることがあります。

17
teknopaul

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

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

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

#!/usr/bin/env bash

FreeBSDでは、bashは/usr/local/bin/bashにあるためです。

10
moebius_eye

Dos2unixがない場合、これはこの問題を修正する方法です。

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

バイト順マーク(BOM)

これは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
3
Fabien Haddadi

誤って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を削除することで、これを解決しました。

0
jan