1.エラー(発生事例)
以下の事例(コマンド実行、エラー表示)が発生したとします。
sh-4.4# ./init.sh sh:
./init.sh: /bin/bash^M: bad interpreter: No such file or directory
2.エラーの原因
(1)このエラーメッセージは、シェルスクリプトの先頭にあるシバン (shebang) #!/bin/bash
が正しく認識されなかったことを示しています。
(2)ここでの ^M
は、Windows の改行コード (\r\n
) の中の \r
に対応します。Linux は改行コードとして \n
のみを使用するため、\r
を誤って解釈し、結果としてシェルスクリプトのシバンが正しく動作しなくなります。
3.解決方法
(1)dos2unix
コマンドを使用
dos2unix
は、Windows の改行コードを Unix/Linux 形式に変換するユーティリティです。もしコンテナやシステムにインストールされていれば、以下のようにして init.sh
の改行コードを変換できます。
dos2unix init.sh
※但し、上記コマンドがインストールされていない環境あり。
(2)テキストエディタを使用(お薦め)
もし手元のマシンにテキストエディタがあれば、それを使ってファイルを開き、Unix/Linux 形式の改行コード (\n
) で保存し直すことも可能です。例えば、VSCode のようなエディタでは、右下の改行コードの表示部分をクリックして変更することができます。
以下はVS Codeによる手順は以下の通りです。
①ファイルを開く:
VS Codeを起動し、File
> Open File
を選択して、変更したい init.sh
ファイルを開きます。
②右下の改行コードの表示を確認
VS Codeのエディタの右下に、現在の改行コードが表示されています(CRLF
または LF
)。CRLF
はWindowsの改行コード、LF
はUnix/Linuxの改行コードを示しています。
③改行コードを変更
右下の CRLF
または LF
をクリックします。
表示されるメニューから希望する改行コードを選択します。この場合、LF
を選択して、Unix/Linux形式の改行コードに変更します。
④変更を保存
ファイルを保存します。File
> Save
を選択するか、キーボードショートカット (Ctrl + S
または Cmd + S
on macOS) を使用します。
これで、init.sh
の改行コードがUnix/Linux形式に変更されました。再びそのスクリプトをLinux環境やDockerコンテナ内で実行すると、先ほどのエラーは発生しなくなるはずです。
(3)sed
コマンドを使用
sed
コマンドを使って ^M
を削除することもできます。ただし、キーボードで直接 ^M
を入力するのではなく、Ctrl + V
および Ctrl + M
を同時に押すことで入力できます。
sed -i ‘s/^M$//’ init.sh