ある実験をするためにシェルスクリプトを書いたのですが、「そのようなファイルやディレクトリはありません」と言われてしまいました。
ネット検索をしてみると、よくある原因は改行コードがCRLFになっていること(CRが余計)らしいのですが、今回は違いました。
真犯人は「BOM」でした。
経緯
どんなスクリプトを書いても同じ結果になるので、以下のシンプルなスクリプトにして実験しました。
#!/bin/bash echo "Hahaha!"
このスクリプトを「uho.sh」というファイルにして、実行したのですが
./uho.sh: 行 1: #!/bin/bash: そのようなファイルやディレクトリはありません
と表示されます。そこで、
cat -A uho.sh
としたら、
M-oM-;M-?#!/bin/bash$ $ echo "Hahaha!"$
と表示されました。
^M(CRを表す)は無く、$マークは「LF」なので、改行コードに問題はありません。しかし、1行目の#よりも前に謎の文字があります。
ネット情報によると、これはUTF-8の符号(BOM)とのこと。
そこで、スクリプトを書くのに使ったvimの設定ファイルを見たところ
set encoding=utf-8 bomb
という記述を見つけました。この行からbombを削除し、vimで同じスクリプトを書いたところ、普通にスクリプトが実行されました。
念のためcat -A を実行してみると、
#!/bin/bash$ $ echo "Hahaha!"$
となっておりました。めでたしめでたし。
(追記)
Apacheの設定ファイルで似たような目にあっている記事を見つけました。
https://think-t.hatenablog.com/entry/20100713/1279034152