Next: , Up: Portable Shell


10.1 シェル

いくつかのシェルのファミリーがあり,最も重要なものは,Bourneファミリーと Cシェルファミリーで,それらは全く互換性がありません.移植性の高いシェル スクリプトを書きたい場合,Cシェルファミリーのメンバーは避けてください. the Shell difference FAQには,Unixシェルの小さな歴史と,それらの間の比較が 書かれています.

以下で,Bourneシェルファミリーのメンバーを,いくつか説明していきます.

Ash
ashは,動作の軽いBourne互換シェルとしてGNU/Linuxと BSDシステムでよく使用されています.Ash 0.2には0.3.xシリーズで 修正されているバグがいくつかありますが,バージョン0.2は多くの GNU/Linux 配布物で配布されているので,移植性の高いシェルスクリ プトではそれを回避すべきです.

Ash 0.2での互換性のため以下のようにしてください.


Bash
bashを実行しているかどうかを検出するために, BASH_VERSIONが設定されているかどうかをテストしてください.その拡 張を利用不可能にし,POSIX互換性を要求するため,‘set -o posix’ を実行してください.詳細は,See Bash POSIX Mode.
Bash 2.05とそれ以降
バージョン2.05とそれ以降のbashは,set組み込みコマン ドの出力に対して,その出力をより容易に評価できるように設計されているので, 異なる書式を使用しています.しかし,この出力はそれ以前のバージョンの bash(や,おそらくそれ以外の多くのシェル)と互換性がありません. そのため,bash 2.05やそれ以上のものをconfigureの実行 に使用している場合,それ以外のすべてのビルドの作業に対しても,同じように bash 2.05を使用する必要があるでしょう.
Ksh
KornシェルはBourneファミリーと互換性があり,POSIXにほとんど準 拠しています.一般的に‘ksh88’と‘ksh93’という二つの有名な変種が あり,最初のリリースの年で後から命名されました.それらは通常 kshと呼ばれていますが,Solarisシステムには三つの変種があります. /usr/bin/kshは‘ksh88’です. /usr/xpg4/bin/shPOSIX準拠の‘ksh88’の類似物で す. /usr/dt/bin/dtkshは‘ksh93’です./usr/bin/kshが Soralisの標準です.それ以外の類似物はオプションパッケージの一部です.こ れらのパッケージには追加の変更はありませんが.それらは最小限のOSのインス トールの一部ではないので,インストール状況によっては無いかもしれません. パブリックドメインの‘pdksh’と呼ばれているKornシェルのクローンも広く 利用可能になっています.それは,いくつか独自のものがありますが ‘ksh88’の機能のほとんどがあります.
Zsh
zshが実行されているかどうかを検出するために, 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/shPOSIXシェルではありません.

そのため,ほとんど現在のシステムはPOSIX標準に適合しているシェ ルがどこかにあるのですが,問題はそれを見つけることです.