Next: Here-Documents, Up: Portable Shell
いくつかのシェルのファミリーがあり,最も重要なものは,Bourneファミリーと Cシェルファミリーで,それらは全く互換性がありません.移植性の高いシェル スクリプトを書きたい場合,Cシェルファミリーのメンバーは避けてください. the Shell difference FAQには,Unixシェルの小さな歴史と,それらの間の比較が 書かれています.
以下で,Bourneシェルファミリーのメンバーを,いくつか説明していきます.
Ash 0.2での互換性のため以下のようにしてください.
foo= false $foo echo "Don't use it: $?"
cat ${FOO=`bar`}
BASH_VERSION
が設定されているかどうかをテストしてください.その拡
張を利用不可能にし,POSIX互換性を要求するため,‘set -o
posix’ を実行してください.詳細は,See Bash POSIX Mode.
ZSH_VERSION
が設定されているかどうかをテストしてください.デフォル
トで,zshはBourneと互換性はありません.‘emulate
sh’を実行し,NULLCMD
を‘:’に設定する必要があります.詳細は,
See Compatibility.
Zsh 3.0.8は,Mac OS X 10.0.3でのネイティブな/bin/shです.
Russ AllberyとRobert Lipeの間でなされた,以下の議論は読む価値があります.
Russ Allbery:
/bin/shが唯一のシェルであるというGNU仮定では,永久に 行き詰まってしまいます.ベンダーは,ユーザの既存のシェルスクリプトを壊し たくはありませんし,BourneシェルにはPOSIXシェルと完全に互換で はない部分もあります.このため,この方法を採用するベンダーは,決し て (OK...“決して,決してとは言わないよ”)Bourneシェルを (/bin/shとして)POSIXシェルで置き換えないでしょう.
Robert Lipe:
これは本当に問題です.ほとんどのもの(少なくともほとんどのSystem V)はシェ ル関数を受け入れるBourneシェルがあるのですが,ほとんどのベンダーの /bin/shはPOSIXシェルではありません.そのため,ほとんど現在のシステムはPOSIX標準に適合しているシェ ルがどこかにあるのですが,問題はそれを見つけることです.