恥は/dev/nullへ by 初心者

プログラミング素人がのろのろと学んだことをつづっています♪

シェルスクリプトを実行しようとすると「そのようなファイルやディレクトリはありません」と言われる

ある実験をするためにシェルスクリプトを書いたのですが、「そのようなファイルやディレクトリはありません」と言われてしまいました。

ネット検索をしてみると、よくある原因は改行コードが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