Linuxでは/bin/shも/bin/bashも同じで/bin/shは/bin/bashへのシンボリックリンクですが、MacOSの場合、/bin/shと/bin/bashは微妙に異なっています。
# uname -a Darwin mbp.local 13.1.0 Darwin Kernel Version 13.1.0: Wed Apr 2 23:52:02 PDT 2014; root:xnu-2422.92.1~2/RELEASE_X86_64 x86_64 # ls -l /bin/bash /bin/sh -r-xr-xr-x 1 root wheel 1228240 10 31 2013 /bin/bash -r-xr-xr-x 1 root wheel 1228304 10 31 2013 /bin/sh # gsha1sum /bin/bash /bin/sh 5151b7973af09c094516a602efae96dd702a8424 /bin/bash 2ff0132fe784dcd3aeb1c258b064eb2592776652 /bin/sh
実体はどちらもbash-3.2です。意外と古いですね。
# sh sh-3.2$ echo $BASH_VERSION 3.2.51(1)-release sh-3.2$ exit # bash bash-3.2$ echo $BASH_VERSION 3.2.51(1)-release bash-3.2$ exit
しかし、bashとshでは、初期設定が少し異なっています。大きく異なるのはPOSIXLY_CORRECTの値。shはPOSIXLY_CORRECT=yですが、bashは未設定です。この値が設定されているMacOSの/bin/shは、私が多用するecho -nが”-n\n”が出力されたりして、甚だ不便です。Linuxの場合はPOSIXLY_CORRECT=yでもecho -nは正しく改行なし-n抜きで出力してくれます。つまり、シェルスクリプトを実行するときに、Linuxであればsh hogehoge.shで良かったのが、MacOSではbash hogehoge.shとする必要があるわけです。これは忌々しい。/bin/echo -nなら問題ないが、echoごときにいちいち/binなんてつけてらんないし。
しょうがないので最近はシェルスクリプトの先頭付近にunset POSIXLY_CORRECTと書くようになりました。しかし、なんかこういうのは負けた気分になるね。