shellでハマった「sh」と「bash」の違いについて

2015年6月16日

Shell Tips トラブル プログラミング

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の違いではなさそうです。 引き続きこのへんも調査して、便利に使えるようにしておきましょう。

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。