web-dev-qa-db-ja.com

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

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

-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ユーザーに対する正しい権限がないことを意味しますか?

99
user165062

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

/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
175
Gilles

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

22
ortang

ファイルには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はファイルを正しく解釈できるはずです。

17
Byte Commander

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

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

:set ff=unix
:wq

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

5
DaFreder

vi <your script>を実行します。

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

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

:%s/^M//gc [^Mと入力するには]を押します Ctrl + v + m]

4
Pankaj Sain

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

fromdos file

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

Sudo apt-get install tofrodos
4
josediazaz

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

2
tphistry