Bashプログラミング
 Computer >> コンピューター >  >> プログラミング >> Bashプログラミング

Bashシェルの誕生秘話:Unixからフリーソフトウェアへの進化

シェルスクリプトは、システム管理者にとって欠かせない必須スキルです。そして現在、最も広く使われているシェルが「Bash(バッシュ)」です。BashはほぼすべてのLinuxディストリビューションや最新のmacOSに標準搭載されており、近いうちにWindows Terminalのネイティブ機能としても組み込まれる予定です。言うなれば、Bashは今や「どこにでもある」存在なのです。

では、Bashはどのようにしてここまで普及したのでしょうか。ポッドキャスト「Command Line Heroes」の今回は、実際にコードを書いた本人たちに直接話を聞きながら、この疑問を深く掘り下げています。

すべてはUnixから始まった

プログラミング関連の話題と同じように、その起源はUnixにさかのぼります。少しシェルの歴史をおさらいしましょう。1971年、Ken Thompson(ケン・トンプソン)が最初のUnixシェルである「Thompsonシェル」をリリースしました。しかし、ユーザーが行えるスクリプト処理には大きな制約があり、それは自動化の限界、ひいてはIT運用全般の発展を妨げる要因となりました。

この優れた研究資料には、初期のスクリプトが直面していた課題がまとめられています(コマンド部分は太字で強調):

Multics時代の前身と同様に、このシェル(/bin/sh)はカーネルの外部で動作する独立したユーザープログラムでした。グロブ(*.txt のようなパラメータ展開のためのパターンマッチング)といった概念は glob という別ユーティリティとして実装され、条件式を評価する if コマンドも同様に分離されていました。この設計により、シェルはCソースコード900行未満というコンパクトなサイズに保たれていました。

このシェルは、リダイレクト(< > および >>)やパイプ(| または ^)のための簡潔な構文を導入しました。これらの構文は現代のシェルにも受け継がれています。また、順次実行コマンド(;)や非同期コマンド(&)のサポートも備えていました。

しかしThompsonシェルに欠けていたのは、スクリプトを実行する能力でした。その役割は、コマンドを実行して結果を確認するための対話型シェル(コマンドインタプリタ)に限定されていたのです。

端末へのアクセスが拡大するにつれ、自動化への関心も高まっていきました。

一歩前進したBourneシェル

Thompsonシェルの登場から6年後の1977年、Stephen Bourne(スティーブン・ボーン)が「Bourneシェル」をリリースしました。これはThompsonシェルが抱えていたスクリプト面の制約を解決することを目的としたものでした(1990年以降Bashの主要メンテナを務めるChet Rameyが、このエピソードでその経緯について語っています)。Bell Labsから生まれたUnixシステムの一部として、技術は自然な進化を遂げたのです。

では、Bourneは何を変えようとしたのでしょうか。研究者のM. Jonesがわかりやすくまとめています:

Bourneシェルには2つの主な目標がありました。1つはOSのコマンドを対話的に実行するコマンドインタプリタとして機能すること、もう1つはスクリプティング(シェル経由で呼び出せる再利用可能なスクリプトの作成)に対応することです。Thompsonシェルを置き換えるだけでなく、Bourneシェルは先行シェルに対していくつもの利点を持っていました。Bourneは制御フロー、ループ、変数をスクリプトに導入し、対話・非対話の両方でOSとやり取りできる、より高機能な言語を提供しました。さらに、シェルスクリプトをフィルタとして使用できるようになり、シグナル処理の統合サポートも備えましたが、関数定義の機能はありませんでした。そして、今日私たちが日常的に使っている多くの機能——たとえばコマンド置換(バッククォートを使用)や、文字列リテラルをスクリプト内に埋め込むヒアドキュメントなど——もここで取り入れられたのです。

Bourne自身は、かつてのインタビューでこう語っています:

元々のシェルは本当の意味での言語ではありませんでした。それは「記録」であり、ファイルに書かれた一連のコマンドを順番に実行する手段にすぎませんでした。制御フローのプリミティブは「GOTO ラベル」だけです。Ken Thompsonが書いたオリジナルのシェルには重大な制約がありました。たとえば、コマンドスクリプトをフィルタとして簡単に使うことができませんでした。コマンドファイル自体が標準入力になってしまうからです。フィルタにおける標準入力は親プロセスから引き継ぐものであって、コマンドファイルではないのです。

オリジナルのシェルはシンプルでしたが、人々がアプリケーション開発やスクリプト用途でUnixを使い始めると、あまりに制約が多すぎることが明らかになりました。変数はなく、制御フローもなく、クォート機能も非常に不十分だったのです。

この新しいシェルは、スクリプト作成者にとって大きな前進となりました。ただし、それにアクセスできる人に限った話ですが。

Bourneシェルをフリーソフトウェアとして再構築する

当時、主流だったシェルはBell Labsが所有・運用するプロプライエタリソフトウェアでした。幸運に恵まれれば、大学がUnixシェルへのアクセス権を持っていることもあるかもしれません。しかしそのような制限されたアクセス環境は、Free Software Foundation(FSF)が目指す世界とは程遠いものでした。

Richard Stallman(リチャード・ストールマン)と志を同じくする開発者たちは、GNUライセンスのもと自由に利用できる形で、Unixの全機能を書き直していました。その中の一人がシェル開発を担当することになり、その開発者こそBrian Fox(ブライアン・フォックス)でした。彼が自分の任務について語る様子には、実に魅了されます。ポッドキャストの中で彼はこう述べています:

この作業が非常に難しかった理由は、Bourneシェルのすべての挙動を忠実に再現しなければならない一方で、同時にそれを拡張して、より使いやすいツールにすることも求められていたからです。

これはまさに、シェル標準とは何かが議論されていた時代でもありました。こうした歴史を背景に、競争を前にして、人気のあったBourneシェルは新しく生まれ変わることになったのです。

「Bourne-Again」——生まれ変わったシェル

フリーソフトウェアという使命と競争という2つの触媒によって、「Bourne-Again Shell(Bash)」が誕生しました。当時としては異例なことに、Foxは自分の名前をシェルに付けることを避け、Unixからフリーソフトウェアへの進化に焦点を当てました(もちろん「Fox Shell」と名付けて、Fishシェルに先駆けてfshコマンドを実現することもできたのですが……#好機を逃した)。この命名の選択は、彼の人柄をよく表しているようです。エピソードの中でFoxは、個人的な栄光と見られることすら気にしていなかったと語り、プログラミング文化の進化を助けることを目指していたのだと言います。とはいえ、彼も良いダジャレには抗えなかったようです。

心温まることに、Bourne自身はこの言葉遊びに不快感を覚えていなかったそうです。Bourneはこんなエピソードを紹介しています。あるカンファレンスで、誰かが近づいてきて彼にBashのTシャツを贈ってくれたのだとか。その人物こそ、ほかならぬBrian Foxだったのです。

シェルリリース年開発者
Thompson Shell1971年Ken Thompson
Bourne Shell1977年Stephen Bourne
Bourne-Again Shell1989年Brian Fox

時が経つにつれ、Bashは採用範囲を広げていきました。他のエンジニアたちが使い始め、設計の改善提案を送ってくるようになったのです。実際、数年後のFoxは「Bashのコントロールを手放すことを学んだことは、人生で最も重要な出来事の一つだった」と語っています。UnixからLinuxへ、そしてオープンソースソフトウェア運動へと移り変わる中で、Bashはオープンソースの世界におけるスクリプティングの中心的な力となりました。偉大なプロジェクトは、一人の人間のビジョンの枠を超えて成長していくもののようです。

シェルの歴史から学べること

シェルはノートパソコンの日常的な利用に不可欠な技術であり、それが発明を必要としたものであることを忘れがちです。ThompsonからBourne、そしてBashへと至る物語からは、いくつかの示唆に富んだ教訓が得られます:

  • 正しい使命を掲げれば、情熱を持った個人が大きく飛躍できる。
  • 今日私たちが頼りにしているものの多くは、業界の存命のレジェンドたちの仕事の上に築かれている。
  • 生き残るソフトウェアは、原作者のビジョンを超えて進化するものだ。

「Command Line Heroes」はシーズン3全体を通じてプログラミング言語を取り上げており、まもなくフィナーレを迎えます。プログラミング言語の起源について知りたいことはすべて学べるよう、ぜひ購読してください。そして、あなたのシェルにまつわるエピソードも、ぜひ下のコメント欄でお聞かせください。

  1. 主要Linuxディストリビューションの歴史――Ubuntu、Fedora、Debianなど誕生の背景と特徴

    Linuxは1991年の誕生から30年以上の歴史を持ちます。今や世界中のサーバーやスマートフォンを支えるOSとなったLinuxですが、その歴史には数多くのドラマがあります。この記事では、Ubuntu、Fedora、RHEL(Red Hat Enterprise Linux)、Linux Mint、Slackwareなど、主要なLinuxディストリビューションがどのように生まれたのか、そしてそれぞれ何が違うのかをコンパクトに解説します。 注:現在存在するディストリビューションは非常に多いため、ここでは主要なものに絞って紹介します。 そもそもLinuxそのものの歴史とは? 各ディストリビューショ

  2. jm-shell – 情報量豊富で自由にカスタマイズできるBashシェル

    jm-shellとは jm-shellは、無料で利用できるオープンソースの軽量Bashシェルです。シェル上での操作に関する豊富な情報をリアルタイムに表示するだけでなく、システムの負荷平均やノートパソコンのバッテリー状態など、実用的なシステム情報もひと目で確認できます。 特筆すべき点として、通常のBashが重複を除いたコマンドのみを履歴ファイルに保存するのに対し、jm-shellはすべてのシェル操作をログファイルに記録します。これにより、過去に実行したコマンドを後から確実に検索・確認できます。 さらに、現在のディレクトリがGit、Subversion、Mercurialなどのバージョン管理システ