Windowsで作成したシェルスクリプト(.sh)をLinuxサーバーにアップロードして、いざ実行!とした初っ端、以下のような冷たいエラーメッセージを喰らったことはありませんか?
-bash: ./script.sh: /bin/bash^M: bad interpreter: No such file or directory
「スクリプトの1行目にはちゃんと #!/bin/bash って書いているし、ファイルも存在するのに、なぜ『そんなファイルやディレクトリはない』って怒られるんだ……?」
実はこれ、スクリプトの中身のバグではなく、WindowsとLinuxの「改行コードのすれ違い」が原因です。今回はその理由と、一瞬で解決するコマンドをまとめました!
🔍 原因:犯人はWindowsの改行コード「CRLF」
WindowsとLinuxでは、テキストファイルの「行の終わり(改行)」を表す見えない記号(改行コード)の規格が異なります。
-
Windowsの改行:
CR+LF(表記上は\r\n) -
Linuxの改行:
LF(表記上は\n)
Windowsのテキストエディタで普通にファイルを保存すると、改行コードは自動的に「CRLF」になります。
これをそのままLinuxに持ってくると、Linux側は CR(\r) の部分を改行として認識できず、^M という謎の文字(制御文字)として読み込んでしまいます。
その結果、シェルスクリプトの先頭にある #!/bin/bash が、Linuxの目には #!/bin/bash^M という名前のプログラムを実行せよ、という命令に見えてしまうのです。「そんな /bin/bash^M なんて名前のインタープリタ(プログラム)はサーバー内に存在しないよ!」というのが、このエラーの正体です。
🛠️ Linux上で一発で直す3つの解決策
Linuxサーバー側で、ファイルに含まれる邪魔な ^M(CRコード)をサクッと消し去るコマンドをご紹介します。
方法1:sed コマンドで一括削除する(おすすめ)
外部ツールが入っていない環境でも、Linuxなら100%標準で使える sed を使った方法が最も手軽です。
sed -i 's/\r//' script.sh
-
解説:
-iオプションでファイルを上書き保存しつつ、ファイル内の\r(CRコード)をすべて綺麗に削除(空文字に置換)します。
方法2:tr コマンドで新しいファイルに書き出す
こちらも標準コマンドを使った古典的で安全な方法です。
tr -d '\r' < script.sh > script_fixed.sh
-
解説:
script.shから\rを削除(-d)した内容を、別名のscript_fixed.shとして出力します。
方法3:dos2unix コマンドを使う(ツールがある場合)
もしサーバーに dos2unix というパッケージがインストールされている(あるいは導入できる)場合は、これが一番直感的です。
dos2unix script.sh
-
解説: Windows形式(dos)の改行コードを、一発でLinux形式(unix)に一括変換してくれます。
💡 予防策:Windows側のエディタ設定を見直そう
根本的にこのエラーを防ぐには、Windows側でコードを書く段階で「Linux向けの改行コード(LF)」を指定して保存するのがベストです。
-
VS Code(Visual Studio Code)の場合: 画面右下のステータスバーにある
CRLFという文字をクリックし、LFに切り替えてから保存する。 -
サクラエディタや秀丸エディタの場合: 「名前を付けて保存」のダイアログで、改行コードの種類を
改行: LFに指定して保存する。
📝 まとめ
シェルスクリプトを実行して初っ端に /bin/bash^M: bad interpreter が出たら、「あ、Windowsの改行コードのまま保存しちゃったな」と一瞬で気付けるようになれば、インフラエンジニアとして一人前です。
慌てず騒がず sed -i 's/\r//' ファイル名 を叩いて、スマートに解決してしまいましょう!
