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

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

#!/bin/bash no such file or directory 

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

どうすればよいですかこれを修正しますか?

コメント

  • この問題はcygwinで発生し、スクリプトはすでに問題なく実行されていると断言できます。すべての回答を確認しました。他の質問と回答でも32/64ビットの問題について言及されていましたが、シェルスクリプトの場合、これは除外できますか?
  • 理由を見つけ、新しい回答に詳細を追加しました unix.stackexchange.com/a/450389/62636 誰かが#!/bin/bash

も使用した場合

そしてここも見てください…

回答

この種のメッセージは通常、偽のシェバンライン、モミの終わりに追加のキャリッジリターン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(またはsedtrawkperlpython…)これが問題である場合は、スクリプトを修正します。

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でスクリプトを作成すると、ファイルの先頭にジャンクが表示されることがあります。

コメント

回答

実際、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メソッドがあります。パーをハードコーディングする必要はありません。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です