読者です 読者をやめる 読者になる 読者になる

カイワレの大冒険 Third

技術的なことや他愛もないことをたまに書いてます

改行コードと「command not found」の関係について

プログラミング プログラミング-シェルスクリプト

作ったシェルスクリプトでどうも「command not found」と言われる。パスは間違ってないし、そんな思い当たる節もない。

ただ、追ってたら、やっと頭に入ったので、無知ながら晒してみる。
コマンドとエラーはこんな感じ。

$ ./test.sh -d 2 -s '192.168.1.11'
: command not foundet/test.sh: line 15
:: command not foundet/test.sh: line 23
:: command not foundet/test.sh: line 27
:'home/www/test.sh: line 31: syntax error near unexpected token `in'home/www/test.sh: line 31: `  case $OPT in

getoptsを使って、オプションを指定して、それに従って必要なことやってくれるだけのシェルスクリプトなんだけど、どうもコマンドを記述してないところですら、コマンドがないと言われる。

この原因は、改行コードにあるんだけど、なぜ改行コードが「command not found」に繋がるのか分からなかった。 ただ、やっとすっきりしたので、メモ。



原因とは

実際自分たちがディスプレイを通じて見ているのは、文字コードによって変換された文字でしかない。元の数値なんてものは普通は分からない。

んで、Windowsでエディタを使って、それをサーバで実行したりしたときに、問題が生じる。

Windowsだと何も設定していないと「CR+LF」で保存しちゃうかもだけど、Unix系ではLFが改行。というか改行はLF。。。

まぁ、それはよいとして「/bin/sh(CR)(LF)」みたいになっていたとすると、Windowsから見れば、CR+LFという二つの文字を改行としているので「/bin/sh」として見做してくれる(改行以外は…)。

けど、これを他のOSに持って行くと、状況は変わる。
要は、他OSでLFが改行を意味するとすると(ほんとはこれが正しいのかな)、
「/bin/sh(CR)」というのがコマンドとなって、こんなパスは存在しないことになる。

なんで「command not found」って言われるのか今ひとつ分からなかったんだけど、 CRも含めたパスになってたから、実行できなかったということをやっと理解できて、すごーく腑に落ちたという話しでした。

まぁ、文字コードだけじゃなく改行コードも普段から意識すべきだし、エディタでデフォルト値とか設定すべきだし、vimとかで編集すれば最初からOSまたぐことないし、突込みどころ満載な気がするけど、どうしてこのエラーなんだーとずっとワケワカメだったので、さらしておこう。

まぁ、なんかそんなエラー吐いてるなと思ったら、odコマンドとかで見てみるとよいのかもしれない。

$od -c test.txt
0001100       .       "   \   n   "   ;  \n   }  \n  \n   ?   >  \n0001117