今日はスティーブン・ボーン (Stephen R. Bourne) の誕生日(1944)。
誰それ、という人でも、彼の名前が付けられた Bourne Shell なら知っているはず。
…あれ? ご存じない?
Linux なんかで、コマンドを打ち込むときに使うものが「シェル」です。
/bin/sh と書いた方がわかりやすいかもしれません。
普通は、わざわざ起動しないでも、ログイン時に勝手に起動されます。
人間の入力を受け付けるプログラムが「シェル」なので、シェルが起動しないと、シェルを起動させることもできないからね。
Linux では、実際には Bourne Shell ではなく、Bourne-again Shell (bash)が使われることが普通です。
Bourne Shell が生まれ変わった (Born-again) 物で、互換性を保ったまま非常に高機能になっています。
Bourne Shell の前は、Thompson Shell が使われていたそうです。
「そうです」っていうのは、さすがにその時代は知らないから。
最初の UNIX を作成した、ケン・トンプソンが作ったシェルで、> と < で標準入出力をファイルにリダイレクトでき、| で別のプログラムに渡せる、という構文は、トンプソン・シェルが最初に定めたものです。
でも、トンプソン・シェルは、ユーザー入力を受け付けるためだけの存在で、その操作を「自動化」するようなことは考えられていませんでした。
…いや、いいんですよ。最初はコンピューターを操作するのがシェルの目的だったし、何か操作を自動化したいなら、プログラムを組むのが当たり前だった。
でも、シェルで定型的に操作するコマンドを、自動化したいという要求が高まってきたのです。
1977年に作られた Bourne Shell は、そうした要求を満たすものでした。
シェルで操作する内容をそのままテキストファイルとして書いておけば、そのまま実行できます(バッチ処理)。
また、直前のコマンドの結果により条件分岐したり、ループを作れたり、「変数」を使えたり、通常のメッセージとエラーメッセージを分離出来たり(エラーは標準出力ではなく、エラー出力を使う)、関数を定義出来たり(1984年のバージョンから)…
「操作の自動化」と言うだけではなく、十分なプログラム言語として成長しました。
スクリプト言語の元祖、と言ってもよいでしょう。
ところで、トンプソン・シェルに限界を感じて作られたのは、 Bourne Shell だけではありません。
カリフォルニア大学バークレイ校(BSD の開発元)では、C Shell というものが作られました。
Bourne Shell は ALGOL 風の表記でプログラムを行うのですが、C Shell はその名前の通り、C 風の表記を使います。
当たり前ですが、Bourne Shell との互換性はありません。
C Shell の特徴は、実はスクリプトの組み方よりも、「操作性の良さ」にあります。
コマンドラインで操作する時に便利な機能が多いのです。
過去に実行したコマンドを大量に覚えておき(ヒストリ機能)、すぐに呼び出せる、というのは C Shell が初めて実装した機能でした。
呼び出すだけでなく、正規表現により一部を書き変えて実行、ということもできます。
後に C Shell の高機能版である tc Shell でさらに便利になり、上下のカーソルキーで過去の実行履歴を呼び出し、左右のカーソルで編集できるようになりました。
そして、現在ではこの機能は Bourne-again Shell でも実装されています。
つまり、現在この機能は「C Shell の優位点」ではなくなっています。
しかし、今でも C Shell の方が優れている部分もあります。
たとえば、大量にファイルが存在していて、そのファイル名を複雑な規則で書き変えたい、という事例があったとしましょう。
C Shell でも Bourne Shell でも、コマンドラインから「すべてのファイルに繰り返し適用」という指示を出すことはできます。
しかし、Bourne Shell (および bash)では、「複雑な規則で書き変え」を指示する方法はありません。
正規表現「マッチ」は出来ますし、マッチした部分を配列に入れることもできます。
ですから、この配列を使ってさらに条件を判断し、目的を達成することは出来るのですが…
これは、ちょっとしたスクリプトプログラムを組まなくてはなりません。
C Shell なら、当たり前に出来ます。
変数の内容などに対し、「正規表現で置換する」ことができるので、「元のファイル名」を「正規表現で置換したファイル名」に書き変える、という指示が1行で書けるのです。
ただ、C Shell でも、その高機能版である tc Shell でも、シェルスクリプトを作る際に「関数」が作れません。
これがかなり致命的で、スクリプトを組むのであれば Bourne Shell の方が組みやすいのです。
僕は会社員時代には tcsh を好んで使っていました。
スクリプトが必要なら、Bourne Shell を使わずに awk や perl で組んでいました。
しかし、Linux って bash が標準であることが多いんですよね…
最初はそれでも tcsh を使っていたのですが、bash ならヒストリ機能なども問題なく使えるし、普段の操作は bash でやるようになりました。
スクリプトなども、他人に渡したりする必要があるものは bash で作ります。
そうすれば、ほぼどこでも動くことが保障されますから。
ただ、今でも先に書いたような「大量のファイル名置換」などが必要な際には、tcsh を起動します。
適材適所で使い分けている。
最後の方は完全にスティーブン・ボーンから話がそれていますが、あらゆるスクリプト言語の元祖であり、今でも UNIX 操作の基本である Bourne Shell を作った、という功績は大きいかと思います。
ちなみに、その後のボーンは、シリコングラフィックスやDEC、SUN、シスコシステムズなど、有名企業で管理職として働いていて、現在も存命です。
当日中に追記
もっと詳しく知りたい人は、IBM の公開している記事Linux におけるシェルの進化をどうぞ。
同じテーマの日記(最近の一覧)
別年同日の日記
申し訳ありませんが、現在意見投稿をできない状態にしています。 |