はじめに
現在、Linux や macOS などで広く使われている bash や zsh といったシェルのルーツは UNIX にあります。UNIX を開発した AT&T ベル研究所では Bourne シェルと Korn シェルの二つの UNIX シェルが開発されました。この記事ではシェルスクリプトの考え方を理解したい人が読むべきものとして、Bourne シェルの開発者と Korn シェルの開発者への二つのインタビュー記事を紹介します。なおインタビュー記事の内容には特に触れていないのでリンク先を参照してください。
UNIX シェルの簡単な歴史
おまけで UNIX シェルの簡単な歴史です。
UNIX で使われていた最初のシェルは Thompson シェル (1971) です。このシェルは変数や関数がないなどプログラミング言語としての機能をほとんど持っておらずフロー制御と呼べる機能は goto
だけで if
などは外部コマンドに頼っていました。Version 3 (1973) でパイプの機能が追加され、Version 6 (1974) までリリースされましたが、Thompson シェルはプログラミング言語ではありませんでした。その後、PWB シェル (1975)(別名 Mashey シェル)が開発されます。このシェルは Thompson にプログラミング言語の機能としていくつかのフロー制御や変数(名前は 1 文字限定)を導入し、コマンド言語を高級言語として使えるようにする試みでした(参考 Using a command language as a high-level programming language)。しかし Thompson シェルをベースとしており様々な制限がありました。
そして 1979 年に Version 7 UNIX で Thompson / PWB シェルを置き換えたのが Bourne シェルです。Bourne シェルは新たにプログラミング言語(スクリプト言語)として再設計され、シェルとシェルスクリプトの両方から使える言語として開発されました。Bourne シェルは最後にシェル関数の機能を追加し、開発者のスティーブン・ボーンは当初の設計上の制約の範囲内で限界に達したと判断として 1983 年に機能追加をやめました。その一方で、人々はより優れた文字列処理や数値計算の機能が欲しいと考え、それが形となったのがデビッド・コーンが開発した Korn シェル (ksh) です。また POSIX でシェルの標準化が始まり、ksh88 のサブセットが POSIX sh のベースとして採用されました。その他のシェルの多くは Bourne シェルまたは Korn シェルのクローンとして開発が始まりました。当時の ksh がプロプライエタリなソフトウェアだったためです(現在はオープンソース)。各シェルは POSIX 準拠を実現し、お互いに機能を取り入れながら、今もなお、より便利なシェルへと進化をつづけています。(Bourne シェルの起源については「Origins of the Bourne shell」を参照)
上記の画像は「What does it mean to be "sh compatible"?」より。分かり易いので引用しているが、Thompson / PWB シェルは Bourne Family Shells ではない。(自分で書き直そうかな?)
インタビュー記事
どちらも素晴らしい内容なので(英語ですが)ぜひ読んでみてください!
Bourne シェル
Korn シェル