.shファイルを実行できません:/ bin / bash ^ M:不正なインタープリター


107

私はシェルスクリプトを実行したかった:

-rwxr-x--x 1 root root   17234 Jun  6 18:31 create_mgw_3shelf_6xIPNI1P.sh

標準手順を実行しようとしましたが、このエラーが発生しました:

./create_mgw_3shelf_6xIPNI1P.sh 
localhost 389 -l /opt/fews/sessions/AMGWM19/log/2013-06-06-143637_CLA-0 
DEBUG   cd/etc/opt/ldapfiles/ldif_in ;
./create_mgw_3shelf_6xIPNI1P.sh 
localhost 389 -l /opt/fews/sessions/AMGWM19/log/2013-06-06-143637_CLA-0
**ERROR  sh: ./create_mgw_3shelf_6xIPNI1P.sh: /bin/bash^M: bad interpreter: No such file or directory**

どういう意味ですか?私はグループのroot下のユーザーとしてこれをしていましたroot

ファイルにrootユーザーの正しい権限がないことを意味しますか?

回答:


182

これは権限の問題ではありません。権限に関するメッセージは表示されません。

/bin/bash^M: bad interpreter: No such file or directory

スクリプトは、にあるシェルで実行する必要があることを示してい/bin/bash^Mます。そのようなファイルはありません:と呼ばれ/bin/bashます。

^Mあるキャリッジリターン文字。Linuxは改行文字を使用しての終わりをマークしますが、Windowsは2文字のシーケンスCR LFを使用します。ファイルにはWindowsの行末記号があり、Linuxを混乱させています。

偽のCR文字を削除します。次のコマンドで実行できます。

sed -i -e 's/\r$//' create_mgw_3shelf_6xIPNI1P.sh

22
または、dos2unixプログラムをインストールして使用します。
argentpepper

4
これに感謝します、私がこれまでに見つけた他のすべての答えは助けになりませんでした。これはやった!
qodeninja 14年

Windowsである必要はありません、OS XからUbuntuにスクリプトをコピーした後、同様のメッセージが表示されました... dos2unixはその場合はうまくいきましたが、「\ r」ファイル内のn '文字。
マイケル

1
@Michael macOSは\nUnixであるため使用します。スクリプトはおそらく以前のMac OSバージョンのものだったのでしょうか?sed -i -e 's/\r$/\n/' script.shその場合は実行できます。
wjandrea

1
geditで開き、[
名前を付け

23

vim :set ff=unixでは、ファイルを使用して保存したり:set ff=dos、DOSフォーマットを再度取得したりすることもできます。


これは私のためにそれをやった、thx
バンカーダイブ

19

ファイルにはDOS / Windowsスタイルの行末(CR LF)がありますが、Unixのようなシステムでは、LF制御文字のみが改行として使用されます。

追加のCR制御文字^M、出力のようにエンコードされて表示されます。実行時に表示することもできますcat -A create_mgw_3shelf_6xIPNI1P.sh

行末をDOS / WindowsスタイルからUnixスタイルに変換するために、というツールがありdos2unixます。以下を使用してインストールします。

sudo apt-get install dos2unix

次に、ファイルの行末を両方の方法で単に変換することができます

dos2unix FILENAME
unix2dos FILENAME

あなたの場合は、次のコマンドを実行するだけで、スクリプトファイルがその場で変換されます。

dos2unix create_mgw_3shelf_6xIPNI1P.sh

その後、Bashはファイルを正しく解釈できるはずです。


1
おかげで、dos2unixはbrew経由でmacOSでも利用可能です。
ムハンマドアナキーブ

5

問題はDosで編集することではありません!

viでファイルを開き、unixを次のように設定します。

:set ff=unix
:wq

そしてそれはすべて大丈夫


4

やりますvi <your script>

その後:set list; スクリプト内の特殊文字が表示されます。

次に、文字を置き換えます。

:%s/^M//gc [ ^Mプレスを入力するにはCtrl+ v+ m]


参照、また、世界的な置換よりも、これを処理するための私見良いですなFileFormatを:使用についての回答の上を参照してくださいstackoverflow.com/questions/14609779/...を自動的に処理する方法のアイデアを
qneill

4

他の回答で説明したように、これはフォーマットの問題です。したがって、答えはDOSからUnixスタイルの行末にフォーマットを変更することです。これは、ファイルを「その場で」修正するもう1つの簡単な方法です

fromdos file

パッケージで利用可能ですtofrodos

sudo apt-get install tofrodos

2

geditを使用して、不要な文字を削除することもできます。[ファイル]メニューで[名前を付けて保存]を選択し、行末タイプunix / Linuxを設定します。


MacOSの行末処理に役立ったため、これに対して+1
ボブル14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.