Just another IT site ※IT系の記事は当方環境での実施内容となるため実施する場合は自己責任でお願いいたします。At Your Own Risk!! TURN BACK WHILE YOU CAN
PR

【Linux】「/bin/bash^M: bad interpreter」エラーの正体と一発で直す対処法

※IT系の記事は当方環境での実施内容となるため実施する場合は自己責任でお願いいたします。スクリプトはAI生成のものも多いのでコピー&ペーストの際は文字コードに注意ください!

Windowsで作成したシェルスクリプト(.sh)をLinuxサーバーにアップロードして、いざ実行!とした初っ端、以下のような冷たいエラーメッセージを喰らったことはありませんか?

-bash: ./script.sh: /bin/bash^M: bad interpreter: No such file or directory

「スクリプトの1行目にはちゃんと #!/bin/bash って書いているし、ファイルも存在するのに、なぜ『そんなファイルやディレクトリはない』って怒られるんだ……?」

実はこれ、スクリプトの中身のバグではなく、WindowsとLinuxの「改行コードのすれ違い」が原因です。今回はその理由と、一瞬で解決するコマンドをまとめました!

スポンサーリンク
バッチ処理の自動化スキルは市場価値が高いです。今の自分の単価を調べてみませんか?
顧客常駐はもう嫌だ!社内SEへ転職するなら【社内SE転職ナビ】
Cursor・Claude Code・Codex AIスキルを学ぶなら
環境構築不要!AIエージェント開発を非エンジニアでも即実践【AI Agent Camp】

🔍 原因:犯人はWindowsの改行コード「CRLF」

WindowsとLinuxでは、テキストファイルの「行の終わり(改行)」を表す見えない記号(改行コード)の規格が異なります。

  • Windowsの改行: CRLF(表記上は \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 を使った方法が最も手軽です。

Bash

sed -i 's/\r//' script.sh
  • 解説: -i オプションでファイルを上書き保存しつつ、ファイル内の \r(CRコード)をすべて綺麗に削除(空文字に置換)します。

方法2:tr コマンドで新しいファイルに書き出す

こちらも標準コマンドを使った古典的で安全な方法です。

Bash

tr -d '\r' < script.sh > script_fixed.sh
  • 解説: script.sh から \r を削除(-d)した内容を、別名の script_fixed.sh として出力します。

方法3:dos2unix コマンドを使う(ツールがある場合)

もしサーバーに dos2unix というパッケージがインストールされている(あるいは導入できる)場合は、これが一番直感的です。

Bash

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//' ファイル名 を叩いて、スマートに解決してしまいましょう!

タイトルとURLをコピーしました