• ザ・ボーン・アイデンティティー

UNIXでは、コマンドラインを処理するプログラムを「シェル(Shell)」と呼んだ。これは一般的には、「コマンドライン・プロセッサ」などと呼ばれている。シェルの第一の目的は、ユーザーからの入力を解釈してコマンドを実行することだ。

こうしたシェルの先祖の1つが1979年に開発が始まったBourne Shellだ(表01)。Linuxなどで広く使われているbash(Bourne Again Shell)のBourneである。これは、開発者であるStephen R. Bourneの名前にちなむ。最初のUnix用に作られたシェルは、現在ではThompson Shell(1971年に開発開始)と呼ばれている。UNIXではいくつもシェルが作られ、作者の名前でそれぞれを区別する習慣になっている。

Thompson Shellは、入出力のリダイレクトやパイプラインなど、現在のシェルの基本的なコマンド構文を装備していた。しかし、シェルスクリプトの機能は持たず、初期のUNIXでは、外部プログラムを利用してコマンドのスクリプト実行を実現していた。

コンピュータでは、同じ処理を繰り返し行うことが多く、一回実行させた複数のコマンドを記録しておき、再度実行できると作業効率が上がる。さらに条件判断や繰り返しなどの構造を導入することで汎用性が高まる。ソフトウェア開発者向けに作られたPWB/UNIX(PWB: Programmers Work Bench)では、Mashey Shell(1975年。PWB Shellとも)が開発された。これは、Thompson Shellと互換性を持たせつつ、構造化プログラミングが可能なようにif-then-else-endifやswitch、whileなどの構文を導入した。しかし、PWB版UNIXでしか動作せず、Thompson Shellに起因する制限があった。

そこで1979年に開発されたのが、Bourne Shellである。Bourne Shellは、構造化プログラミングが可能なスクリプト言語の機能を持つシェルとして開発された。その文法は、ALGOL言語風でIF文には「if-then-elif-then-else-fi」という構文を使う。開発者のStephen R. BourneがALGOL68コンパイラの開発に関わっていた関係でそうなった。Bourne Shellの最大の目的は、シェルスクリプトに本格的な高級言語の文法を導入し、高度なプログラミングを可能にすることにあった。

同じ頃、カリフォルニア大学のバークレー校でVersion 6 UNIXをベースに同校独自のプログラムが追加され、アドオンとして配布が開始されたのがBSD(Berkeley Software Distribution)の始まりである。のちにBSDは、カーネルを含むUNIXのバリエーションとなる。このBSD用に作られたのが、C Shell(1978年)である。C Shellは、Thompson Shellをベースに作られたというが、C言語を手本にした文法を持つなど、Marshy ShellやBourne Shellと同じ方向性を持っていた。

これを始まりとして、AT&Tの商用UNIXではBourne Shellがベースになり、BSD系UNIXでは、C Shell(csh、のちにtcshとなる)が主流になった。C Shellは、コマンドラインの機能充実も行われ、ヒストリ機能やファイルパスの補完、コマンドラインから複数プロセスを制御するジョブ制御機能などが搭載された。C Shellの“C”は、C言語を意味し、C言語風のスクリプト文法を持つ。ただし、コマンドラインで波括弧を別の意味で使っているため、C言語のようにブロック構造には使えなかった。たとえば、IF文は「if-then-else-endif」という形式で、あくまでもC言語風だった。

このC Shellの対抗馬としてAT&T(ベル研究所)で作られたのが、Korn Shell(1983年)である。Bourne Shellをベースに、C Shellのヒストリ機能、ジョブ制御機能などを取り込み、さらにEmacsやvi風のキー割り当てでコマンドラインの編集を可能にした。しかし、Bourne ShellやKorn Shellは、当初はクローズソースの専用ソフトウェアでAT&Tの商用UNIXでしか利用できなかった。

その後、UNIX業界が「モメて」、分断などにより、開発が停滞、あるいは企業の統廃合が起きる。その間に、普及していったのがWindows NTやLinuxなどである。特にLinuxは、UNIXに近いところにいながら、AT&Tのソースコードとは無縁だったため、訴訟で開発が停滞したBSD系UNIXの代わりに普及した。

現在Linuxなどで広く使われているBash(Bourne Again Shell)は、1989年にBourne Shell互換のシェルとしてGNUプロジェクトで開発が行われた。また、Bourne Shellの後継となったKorn Shellも1988年にksh88を出荷する。このあたりから複数のシェルが実装され始める。

変化が起こるのは、1992年にPOSIXが「コマンドライン・インタプリタ」のベースにksh88を想定したこと。これにより、シェルスクリプトの基本文法は、ksh88が基本となった。これPOSIXシェルということがある。Korn ShellがBourne Shellの後継であったため、POSIXシェルに準拠したシェルを「Bourne Shell」系などと総称することがある。厳密にいうとシェルスクリプトの文法は、ksh88か基本であり、オリジナルのBourne Shellとは異なる部分がある。

シェルスクリプトは、UNIX、Linux起動時の「初期化システム」などでサービスやデーモンの起動制御などに使われることから、ある種の互換性が必要になる。しかし、シェルスクリプトには、「シバン(shebang)」という仕組みがあり、スクリプトファイルの先頭でスクリプトの実行プログラム(インタプリタ)を指定できる。このシバンは、UNIX開発者の一人Dennis Ritchieによって考案され、Version 7、8UNIXで導入され、BSDにも搭載された。このため、シェルスクリプトのインタプリタとしてPOSIXシェル互換のインタプリタさえ用意できれば、コマンドラインプロセッサには、何を使ってもかまわない。

現在のハードウェア構成なら、シェル程度のプログラムならいくつインストールしてもシステムを圧迫することもない。また、多くのLinuxディストリビューションは、著名なシェルはたいたいパッケージが用意されている。利用者が各シェルの初期化ファイルで混乱しなければ、ログインシェルでさえ好きな物に切り替えることができる。高機能なものを使うのもよし、あえてシンプルなシェルを使うことだってできる。シェルが使い放題、良い時代になったものである。

今回のタイトルネタは、ロバート・ラドラムの「暗殺者」(新潮文庫。原題The Bourne Identity)である。主人公であるジェイソン・ボーンの姓は、偶然であるがBourne Shellの作者と同じ綴りである。2002年にマット・デイモン主演で映画化され興行成績も悪くなかったので、ごらんになった方もいるだろう。ただ、映画と原作は別物、原作で面白さを味わうべき作品の1つ。