現代のUNIX環境で使用されるほとんどのシェルは、POSIX sh仕様に準拠することを目的としています。POSIX shは、元のKornシェル(ksh88)から派生しています。これは、以前のBourneシェルから派生していますが、POSIX shは、ksh88の機能の小さなサブセットのみを指定します。最小要件のみを実装するシェルには、最も些細なスクリプトを安全かつ合理的な方法で記述するために必要な多くの機能が欠けています。たとえば、ローカル変数とローカル配列は非標準の追加です。
したがって、最初の理由は、追加機能でシェルを拡張することです。さまざまなシェルが、さまざまなことに集中することを選択します。たとえば、Zshは高度なインタラクティブ機能に焦点を当て、ksh93(現在の「オリジナル」のkornシェル)は強力なプログラミング機能とパフォーマンスに焦点を当てています。Dashのような非常に最小限のシェルでさえ、ローカル変数のような非標準のエクストラを少なくともいくつか追加します。
追加機能が広く相互運用可能である場合はほとんどありません。拡張グロブ構文など、ksh88機能セットのほとんどは相互運用性がかなり高くなっていますが、非標準機能では保証はなく、移植性のある方法でそれらを使用するために何をしているのかを本当に知る必要があります。
2番目の理由はレガシーです。/ bin / shに古代の非標準の実装を使用する独自のUnixがまだたくさんあります。Solarisは最近まで、Bourneをデフォールトとして使用し、最新のものにアップグレードするのではなく、Heirloomシェルを維持することを選択しました。これらのシステムには通常、たとえば、PATH変数を変更したり、個々のスクリプト内のシバンを変更したりすることで、切り替えることができるさまざまなシェルが付属しています。
要約すると。多くの場合、デフォルトでは複数のシェルがあります。
- 特別な機能、特に非ポータブルの追加機能を扱う場合。
- メンテナンスされないことが多いレガシースクリプトを処理するため。
- サイズ/パフォーマンス。組み込みシステムでは、多くの場合、mkshやbusybox shなどの小さなシェルが必要です。
- ライセンスの理由。AT&T kshは2000年頃まで独自のソフトウェアでした。これは主に、ZshやBashなどのすべてのkshのようなクローンを生み出したものです。
- その他の歴史的理由。今日ではあまり人気がありませんが、scshやesなど、言語の再設計に急進的な試みがあります。多くのシェルのプロセス置換機能は、元々rc(少し異なる構文を使用)、およびcshからのブレース展開に由来しています。異なるシェルには、通常、微妙な違いまたはそれほど微妙ではない違いを伴う、そのような機能のさまざまな組み合わせがあります。