conf t

インフラエンジニアのメモ

bashのエラー:/bin/bash^M

linuxサーバのシェルスクリプト改修中に遭遇したエラー

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

/bin/bash^Mはありません というエラーらしい。 which bashでパスを確認するもちゃんとパスは通っている。
というか最後の^Mはなんなの?

調べたら、どうやら改行コードの間違いらしい。
宣言文の

#!/bin/bash

bashの場所を宣言しているが、この一行の末尾にWindowsの改行コードが入ってるから発生したみたい。
^Mは制御コードで、これを正規表現でマッチしたいときは\rを使う。

解決策としては以下のようにsedで一括置換してやります。

$ sed -i 's/\r//' <対象ファイル>

改行コードについてOS毎に違うって話はなんとなくしってたけど、
あまり知らなかったのでついでに調べた

OS UNIX Windows
記号 LF CR + LF
正規表現 \n \r\n

らしい。 今回のエラーではWindowsの改行コードである\r\nが入ってたから起きた事象。
だからいらない\rを消してやればOKだったわけです。

参考:
/bin/bash^M: bad interpreter: そのようなファイルやディレクトリはありません (No such file or directory) - カタカタブログ

改行コードの話