linuxを使っているとshとbashというコマンド対応言語が数種類あることは知っていたが、その2つの違いはさほど認識していなかった。
本日、ツールを実行していて、どうしてもエラーが回避できなかったので、調べていた結果、shとbashの違いによる
エラーという事が判明したので、備忘録としてメモしておきます。
事の発端はshellで配列を使いたかっただけ
shell.sh
#!/bin/sh
arr=(“a” “b” “c")
echo ${arr[1]}
これで配列の1番目(0からスタート)の「b」という文字列が帰ってくれば問題ないのだが、
開発していた端末ではうまく動作し、検証環境において、エラーが発生
エラー内容
下記のようなエラーが出て一向に進まない状態。
調べてみても、エスケープ処理が違うとか、配列文字が長すぎるなどという的違いな答えばかり。
$ sh shell.sh
shell.sh: Syntax error: "(" unexpected (expecting "fi")
実行環境
開発端末 : Mac OS X
検証環境 : Vagrant Linux [ ubuntu 14 ]
本番環境 : debian7
どうやら、macOSとlinuxに何か決定的な違いがあると思われる。
きっと検証環境と本番環境は同じディストリのlinuxであるから、本番でも同じ事が
起きると思われる。
原因判明
shellの文献を見ているとどうやらbashという文字がやたらにあるので、shではなくbashが通常と思われる。
shell.shの1行目に「#!/bin/sh」とある箇所が悪いのかと思い、「#!/bin/bash」に変更してみるも、
結果は変わらず。
そして、コマンド実行に原因があることに気がついた。
(ここまで2時間・・・orz)
$ bash shell.sh
> b
無事にlinuxでエラーも出ずに返り値を取得できた。
さらに、macでもbashコマンドにて、同様のレスをゲット
なんという事でしょう。
Macはshとbashで同じ結果だったのです。
Linuxはshとbashで違いがありますが、とりあえず、今後は特殊な環境で無い限り「bash」を使おうと心に違いました。
失敗を経て成長するべし
原因に気がつくまでの遠い道のりは、成功への足がかりとして心に止めておくことにしよう。
ちなみに、こまった事がもうひとつあり、「date」コマンドでミリ秒の取得で
Mac : 取得できない
Linux : 取得できる
という違いも発生していて、これはshとbashの違いではなさそうです。
引き続きこのへんも調査して、便利に使えるようにしておきましょう。
0 件のコメント:
コメントを投稿