bashスクリプトを作成しましたが、実行しようとすると
#!/bin/bash no such file or directory
コマンドを実行する必要があります:bash script.sh
それを機能させるには。
どうすればよいですかこれを修正しますか?
コメント
も使用した場合
そしてここも見てください…
回答
この種のメッセージは通常、偽のシェバンライン、モミの終わりに追加のキャリッジリターンst行またはその先頭の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
スクリプトの実行に使用しているシェルは、表示されるエラーメッセージにわずかに影響することに注意してください。
名前を表示するだけの3つのスクリプトがあります(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
boの実行インタープリターを明示的に呼び出すことで、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
を使用して修正します。 - CRLFの問題の場合は、'は表示されません。
#!/bin/bash no such file or directory
エラーメッセージ。'は、#!/bin/bash
。 ' s/bin/bash<CR>
何が実行されるか - @StephaneChazelas dos2unixが問題を修正したので、疑いはほとんどありません。 ' TACRLFの問題ではありませんでした。エラーメッセージは、おそらく不正確に転写されただけです。
-
dos2unix
もUTF-8BOMを削除します。 UTF-8BOMがエラーメッセージを説明している可能性があります。 - Microsoftの互換性がいかに低いかは悲しいことです。 ASCIIのような基本的なものでも。
回答
これは、UTFのBOMによっても発生する可能性があります。 -8スクリプト。 Windowsでスクリプトを作成すると、ファイルの先頭にジャンクが表示されることがあります。
コメント
- BOMは、awkを使用して簡単に削除できます。 stackoverflow.com/questions/1068650/ …
- のようにMacはBOMを挿入します。
回答
実際、bashスクリプトの正しいシバンは次のとおりです。
#!/usr/bin/env bash
freeBSDでは、bashは/usr/local/bin/bash
コメント
にあるため
- " right "は、このような場合に使用するのが難しい単語です。おそらく、より適切なフレーズは、"エラーが発生しにくい"です。
- これもひどいです。 / usrが存在するという仮定は悪いIMOです。たとえば、Haikuには/ usrがありません。
回答
viを使用して両方の問題を修正できます存在する場合:
vi <your_file> :set ff=unix :set nobomb :wq
コメント
- 回答は可能な限り自己完結型にする必要があります。この質問では、2つの問題については触れられていません。他の答えに基づいて構築する場合は、少なくともそれらが何であるかを言う必要があります。さらに良いことに、これが質問に答える方法を説明する必要があります。
- Windowsツールをダウンロードせずに非常に迅速に修正できます。ありがとうございます。
- @ G-Manその他の回答私が入りたいよりもはるかに詳細にこれについてすでに言及しました。繰り返す必要はありませんが、'がそれほど明白でない場合は、Windowsの行末と非表示のWindowsBOM文字を使用できます。回答をスキャンしている多くの人は、特に他の回答に詳細がある場合は、自己完結型ではなく簡潔さを高く評価していると思います。
回答
dos2unixがない場合、これはこの問題を修正する方法です。
cp script _p4 && tr -d "\r" < _p4 > script && rm _p4
回答
バイト順マーク(BOM)
これは次の原因で発生する可能性がありますBOM。ウィキペディアから、BOMは
バイト順マーク(BOM)はUnicode文字、U + FEFFバイト順マーク(BOM)です。 、テキストストリームの開始時にマジックナンバーとして表示されると、テキストを消費するプログラムにいくつかの信号を送ることができます
残念ながら、シーバンラインを処理するLinuxカーネルには何も通知しません。 file
を使用して、BOMがあることを確認できます。 、
file /tmp/foo /tmp/foo: UTF-8 Unicode (with BOM) text
または、hexdumpすることができます最初の数文字を確認し、いずれかのBOM文字と手動で一致するかどうかを確認します
このようになったら、BOM文字を削除できます、
sed -i "1 s/^\xef\xbb\xbf//" *.txt
回答
誤って間違ったbashを追加して問題が発生しましたPATH
に対して実行可能ファイルであり、私のスクリプトではより柔軟な#!/usr/bin/env bash
シバンが使用されたためです(パスから最初のbash実行可能ファイルを取得します)。
command -v bash /cygdrive/c/Program Files/Git/bin//bash
GIT forWindowsをインストールしてcygwin
とWindowsGIT GUIを組み合わせました(cygwinネイティブgitでは機能しませんでした) …)。 #!/bin/bash
shebandに切り替え、PATH
からWindows用のGITを削除することでこれを解決しました。
回答
#!/bin/bash
2番目のこと:find / -name bash
3番目のこと:ls -al /bin/bash
コメント
- または単に
which bash
。 'がbash script.sh
と連携しているため、'が1つを見つけていることがわかります。 - 正しい。また、前述のように、プログラムにbash(または他のインタープリター)を見つけさせるための、はるかに移植性の高い/ usr / bin / envメソッドがあります。パーをハードコーディングする必要はありません。
#!/bin/bash