エディターでは分かりにくい、.shなのに実行できないスクリプトファイルの確認方法


目的

他者/他社からzipやtar.gzで.shファイルを受領、
linux環境で実行してみると以下のエラーメッセージが表示される。

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

- 特に送り主がWindowsをメインとしている環境からの場合が要注意

結論

改行コードをCRLFからLFに置換して実行できるかを確認する。
より正確に言うならCRを除去する

sed -i 's/\r//' *.sh

経緯

エディターで表示させてもUTF-8の.shファイル、しかしlinux上で実行すると、

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

まずcatで改行コードを確認してみる
^MがCR、$がLFを表す

$ cat -e *.sh
#!/usr/bin/env bash$
first_command^M$
second_command^M$

sedで置換してしまいます。

sed -i 's/\r//' *.sh

置換後

$ cat -e *.sh
#!/usr/bin/env bash$
first_command$
second_command$

注意

OSやカーネルのバージョンによってはCRLFであっても実行できる場合があります。

参考url

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