MacOSのbashとshとPOSIXLY_CORRECT

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と書くようになりました。しかし、なんかこういうのは負けた気分になるね。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です