BourneシェルとCシェル、先に誕生したのはどっち？【Unixシェルの初期の歴史】

## はじめに

Wikipedia（英語版）の Initial release は [Bourne シェル](https://en.wikipedia.org/wiki/Bourne_shell)が 1979 年、[C シェル](https://en.wikipedia.org/wiki/C_shell)が 1978 年 となっています（日本語の情報は古く Bourne シェルが 1977 年となっています）。ここだけを見ると C シェルのほうが先に誕生したように見えますが、これはシェルを含んだ「Unix のバージョンが公にリリースされた年」であってシェルそのものが開発され、使われ始めた年ではありません。

一般的にソフトウェアは、ある日突然生まれるわけではありません。一定期間の計画と設計と試行錯誤、アルファ版やベータ版に相当する試用期間や、内部利用などを経て正式に公開されます。具体的な誕生日がわかることは稀です。一般公開された日を誕生日とすることが多いですが、それだと一般公開されたことのない初期の Unix は誕生していないことになってしまいます。内部利用が開始された日を誕生日という考え方も間違いではないでしょう。

Bourne シェルと C シェルは別の場所で別の人が別の設計方針で開発したシェルです。開発期間は重複していますが、**先に誕生したと言えるのは Bourne シェル**です。リリースされた年は C シェルの方が先ですが、AT&T の本家の Unix に対して出来たばかりの分家である BSD Unix は、当時において知名度や影響力はそれほど大きくはなかったはずです。古くからシェルを使っている人にとっては常識レベルの話なのでしょうが、新しくシェルを学ぶ人はそのことがわからないので、Unix シェルの初期の歴史をまとめてみました。

## BourneシェルとCシェルの今

長らく `sh` は Bourne シェルの別名として使われていましたが、現在は「POSIX 標準規格に準拠したシェルのどれか」という汎用名です。かつてシェルは Bourne シェル系（B シェル系）と C シェル系の 2 つの系統があると言われるぐらい両方とも使われていました。しかし現在では **C シェル系が使われることはなくなりました**。また Bourne シェルも他のシェルに置き換えられたため、現在はほとんど使われていません。**Bourne シェルと C シェル はもはや歴史上の古いシェルの名前**です。「B シェル系」や「C シェル系」は昔のシェルの分類方法であり、今更このように分類する意味はありません。現在のシェルを分類するならば「POSIX シェル系」とそれ以外です。

C シェルは元々 BSD Unix 用に開発されたシェルで、BSD Unix の後継の一つである FreeBSD では長い間 root 用のデフォルトシェルとして使われていました。しかし 2023 年 11 月にリリースされた FreeBSD 14 からデフォルトが `sh` に変更されました。新しい人が C シェルを自発的に（または知らずに）使い始めることはもうないでしょう。FreeBSD の sh はもちろん Bourne シェルのことではなく、ash という名前のシェルをベースに FreeBSD が修正を加えた FreeBSD 専用の sh で、POSIX 準拠シェルの一つです。Bourne シェルは Version 7 Unix で登場したシェルで、主に商用 Unix で使用されていました。しかし現在では Bourne シェルを標準で採用する Unix はほとんどなくなり、**Bourne シェルは事実上 Solaris 10 専用シェル**となっています。Solaris 10 は旧バージョンで、当初のサポート終了日時の2021年1月1日を超えて、何度もサポート終了日時が延長されている状態です。Bourne シェルは初期の BSD Unix でも使用されていましたが権利上の問題で ash に置き換わり、Linux で Bourne シェルが使われたことはありません。

C シェルはかつて対話機能に優れたシェルと言われており、対話シェル用に C シェルを使いシェルスクリプト用に Bourne シェルを使うという使い方も多かったのですが、Bourne シェルの後継として 1980 年代の中頃に開発された ksh と、その ksh の機能を取り入れて 1990 年頃に開発された bash と zsh によってその時代は終わりました。Bourne シェルの後継シェルである **ksh、bash、zsh は C シェル以上の対話機能を実装**しており、BSD 系 Unix の sh（ash系、OpenBSD は pdksh 系）でさえ基本的な対話シェルの機能を実装しています。ただし対話用途を想定していない dash には対話シェルの機能はほとんどありません。

C シェルは C 言語に近い文法だと言われることがありますが、実際には **C シェルと C 言語と全く異なる文法**です（いい加減 C 言語に似ているという「使ったことがない人の想像」を広めるのはやめませんか？）。Bourne シェルよりは C 言語に近い部分があると言えばあるかな？という程度で、C と C シェルは Java と JavaScript ぐらい全く違います。むしろ B シェル系として分類される、bash、ksh、zsh の方がよっぽど C言語に近いです。なぜなら C シェルと同様に配列や式の評価を言語機能に組み込んでおり、C 言語風の `for` の使い方に対応し、C シェルにはない関数も使えるからです。

## 年表

初期の Unix シェルの歴史です。Linux が誕生した 1991 年よりも前の時代であることに注意してください。

- Thompson シェル (sh) ・・・ 最初の Unix シェル
- PWB シェル (sh) ・・・ Thompson シェルの改良版
- Bourne シェル (sh) ・・・ 一から書き直されたシェル
- C シェル (csh) ・・・ Thompson シェルをベースに大幅に改良されたシェル

| Year  | Thompson シェル     | PWB シェル           | Bourne シェル   | C シェル    |
| :---: | ------------------- | ------------------- | -------------- | ---------- |
| 1969  | PDP-7 版 Unix       |                     |                |            |
| 1971  | Version 1 版 (11/3) |                     |                |            |
| 1972  | Version 2 版 (3/15) |                     |                |            |
| 1973  | Version 3 版 (1/15) |                     |                |            |
|   :   | Version 4 版 (4/18) | PWB/UNIX<br>開発開始  |                |            |
| 1974  | Version 6 版 (5/15) |                     |                |            |
| 1975  | | PWBシェル<br>リリース | Bourne シェル<br>開発開始  | UCBにUnixが来る |
| 1976  |                     | PWBシェル 論文      | 初期バージョン<br>リリース |       |
| 1977  |                     | PWB/UNIX 1.0        |                | ashell: BSD開発開始     |
| 1978  |                     | PWB/UNIX 2.0        |          | ashell: 1BSD (3/9) |
|   :   |                     |                     |           | csh: 2BSD (5/?) |
| 1979  |                     |                     | Version 7 版   |          |

**補足1**: 上記以降のその他のシェルの歴史

- ksh88: 1980年頃に開発開始。一般的に公開されていないが ksh83 や ksh86 もある
- pdksh: ksh88 クローンで 1987年から1989年頃に開発。その派生版を OpenBSD が採用
- bash: 1988年1月に開発開始し、1989年6月に 0.99 がリリース
- ash: 1989年5月にリリース、その派生版をFreeBSD、NetBSD、Debian系Linux などが採用
- zsh: 1990年頃に1.0がリリース
- ksh93: 1993 年頃に開発開始。ksh88 の大幅強化版だが完全な上位互換ではない

参考: [シェルの歴史 総まとめ（種類と系統図）と POSIX の役割 〜 シェルスクリプトの現在・過去・未来](https://qiita.com/ko1nksm/items/e7f43428352c0b4c78f9)

**補足2**: POSIX 標準化以降

1992 年に POSIX によってシェルの仕様が標準化されました。しかし Bourne シェルは POSIX に準拠することなく 1992 年の SVR4.2 版を最後に開発が事実上終了します。多くの商用 Unix は 1990 年の SVR4.0 版を最後に採用しており、Solaris 10 版の Bourne シェルも SVR4.0 版です。現在の商用 Unix は主に ksh (ksh88/ksh93) を採用しています。Bourne シェルより新しいシェルは POSIX 準拠へと修正が行われ、2000 年頃には POSIX 準拠への作業はほとんど完了しました。

参考: [Bourne Shell(古いsh)とPOSIXシェル(現在のshやbash)の違い](https://qiita.com/ko1nksm/items/6b61b0e687d206be9cb0)
 
## 初期のUnixシェル（1969年～1979年頃まで）

まず参考として Bourne シェルと C シェル**以前**のシェルについて簡単に紹介します。

### 最初のUnixシェルはThompsonシェル

https://en.wikipedia.org/wiki/Thompson_shell

Bourne シェルを最初の Unix シェルと説明しているところを時々見かけますが、これは明らかに間違いです。最初の Unix シェルは Thompson シェルと呼ばれるとても原始的なシェルです。当初は単にシェル（コマンド名は `sh`）と呼ばれていました。なぜなら Unix に他のシェルは存在せず区別する必要がなかったからです。`cp` コマンドをあえて Thompson cp と呼ばないのと同じことです。

Unix は 1969 年に誕生しました。この最初の Unix は PDP-7 というコンピュータで動く Unix でアセンブリ言語で記述されていました。 PDP-11/20 で動作する Unix の最初のバージョン（Version 1 Unix）は 1971 年に完成しました。初期の Unix は研究用の OS （通称 Research Unix）であり、AT&T 内部でしか使用されていないことに注意してください。Unix は 1974 年の Version 4 Unix でアセンブリ言語から C 言語で書き直されました。Thompson シェルが含まれた Unix は 1974年の Version 5 Unix で限られた教育機関で利用できるようになり、1975年の Version 6 Unix で AT&T 外部で広く利用できるようになりました。広く利用できるようになったと言っても現在のようにインターネット経由で誰でも簡単にダウンロードできるようなものではないため、当時に Thompson シェルを使っていた所はそう多くはないでしょう。

Thompson シェルはとても低機能なシェルです。それは当然です。Unix の誕生とともに新しく作られたアセンブリ言語で記述されていたシェルだからです。何が必要なのかもわかっていない時代では、便利さよりも最低限でいいので使い物になることの方が重要です。一応簡単なシェルスクリプト（当時はコマンドファイルなどと呼ばれていました）を書くことはできましたが、フロー制御の機能はシェルには組み込まれておらず、`if` や `goto` は外部コマンドでした。そうです。最初のシェルは現在忌み嫌われている goto が使われていたのです。goto に対する有名な批判ダイクストラの「[Go To Statement Considered Harmful](https://ja.wikipedia.org/wiki/%E6%A7%8B%E9%80%A0%E5%8C%96%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0#1968%E5%B9%B4%E3%81%AE%E6%8A%95%E6%9B%B8%E3%80%8Cgoto%E6%96%87%E3%81%AF%E6%9C%89%E5%AE%B3%E3%80%8D)」は 1968 年の話です。Thompson シェルは Unix のバージョンアップとともに機能が追加されていきましたが、基本的には（シェルスクリプトではなく）対話シェルとして使うためのシェルでした。Thompson シェル時代に発明された重要な機能にはパイプがありますが、シェル変数もなく環境変数はまだ Unix の機能として追加されていませんでした。

### プログラマ向けPWB/UNIX用のPWBシェル

https://en.wikipedia.org/wiki/PWB_shell

Thompson シェルの機能は少なかったとはいえ、それでも外部コマンドの `if` や `goto` を利用することで、フロー制御が含まれるシェルスクリプトを書くことができました。簡易なシェルスクリプトではそれでも十分でしたが、やはり規模が大きくなってくると変数もない原始的な機能だけで複雑なシェルスクリプトを書くことは難しくなってしまいます。そこで Thompson シェルをベースにパッチを当て、機能強化されて作られたシェルが John Mashey によって開発された PWB シェル（別名 Mashey シェル）です。

PWB シェルは PWB/UNIX 用のシェルとして開発されました。Unix は元々研究用の OS として開発が始まりましたが、AT&T が有効性を認識し、自社のプログラマー向けにカスタマイズされた派生版の Unix が PWB/UNIXです。PWB/UNIX は 1973 年 10 月頃に、C 言語で書き直された Version 4 Unix をベースに開発が始まったようです。PWB/UNIX は 1977 年に 1.0 となり広くリリースされました。Wikipedia に記載があるように PWB/UNIX 1.0 は 1984 年になっても教育機関に販売されていたようです（[価格表](https://www.bell-labs.com/usr/dmr/www/licenses/acprice83.pdf)）。


PWB シェルは（PWB/UNIX 1.0 になる前の）1975 年の中頃に完成し PWB/UNIX で使われ始めました。PWB シェルに関する論文「[Using a Command Language as a High-Level Programming Language](https://dl.acm.org/doi/pdf/10.5555/800253.807670)」（コマンド言語を高水準プログラミング言語として使う）は 1976 年 10 月に公開されました。この論文に記された参照文献は [An Introduction to the Programmer's Workbench](https://dl.acm.org/doi/pdf/10.5555/800253.807669) で説明されています。この論文でシェルスクリプトの主な用途は文字列処理であり、`expr` コマンドの主な使用目的は文字列操作で、算術演算のうち**掛け算や割り算はあまり使われない**。`if` で算術比較を行うことはできるが大部分は**文字列比較**である。と言った他の一般的なプログラミング言語との使い方の違いがデータより明らかになっています。この違いはシェル言語が他の言語の代わりにはならず、逆に他の言語がシェル言語の代わりにならない根拠と言えます。シェル言語と他の言語はどちらか片方だけの言語を使うのではなく組み合わせて使うものです。コマンドを作りやすい他の言語でコマンドを作り、それを組み合わせるためにシェルを使います。

`if` や `switch` は PWB シェルに組み込まれましたが、ループに関しては初期の実装では `goto` に頼っており、1976 年の論文では `while` の実装が必要との言及にとどまっています。しかし最終的に [1977年版の PWB シェル](https://www.in-ulm.de/~mascheck/bourne/PWB/)には組み込まれたようです。PWB シェルには以下のコマンドがシェルに組み込まれていました。`test` コマンドに相当するファイルや文字列の比較機能が組み込まれているのが興味深い点です。

```
if(I)	- if, else, endif, and test.
switch(I) - switch, breaksw, endsw.
while(I) - while, end, break, continue.
goto(I) - goto.
exit(I) - exit.
```

このことからもわかるように、PWB シェルでは制御構造を重視しており、当時のデータでは 75% が制御ロジックを含まない直線的なスクリプトだが、残りの 25% は制御ロジックを多用しており「**このパーセンテージはシェルのプログラミング能力に人々が慣れるにつれて時間と共に増えていくだろう**」と述べています。実際に現代のシェルスクリプトでは条件分岐やループと言ったフロー制御の機能が重要になっています。これが対話シェルでの手作業の使い方と、シェルスクリプトでの自動化の使い方の大きな違いであり、シェルをプログラミング言語へと進化させる必要があった理由です。

PWB シェルはコマンド言語（対話シェルで使うための言語）をプログラミング言語として使えるようにするという考え方の基礎になりましたが、Thompson シェルをベースに互換性を保ちながら開発していたために無視できない制限がありました。例えば変数が使えましたが変数名は 1 文字で 26 個しか使えず、そのうちいくつかは特殊な用途に予約されていました。26 個という制限は小さいスクリプトでは十分ですが、変数名が1文字しか使えないことは可読性を低下させる原因となります。シェルでプログラミングを行うという考え方自体は今に通ずるところがありますが、シェル言語の言語機能としては力不足なシェルでした。

こちらで John Mashey へのインタビュー「[Oral History of John Mashey](https://archive.computerhistory.org/resources/access/text/2018/10/102738835-05-01-acc.pdf)」が公開されています。以下はその動画です。

https://www.youtube.com/watch?v=Vd7aH2RrcTc


## Bourneシェルの歴史（1975年頃に誕生）

Bourne シェルは Thompson シェル（または PWB シェル）でシェルスクリプトを書くのは困難であるとして（Thompson シェルのコードを使わずに）一から再設計された開発されたシェルです。AT&T ベル研究所の研究用 Unix の一部として Thompson シェル を置き換えるために開発されたシェルです。`sh` というコマンド名は引き継いでいますが、（単純なコマンド実行を除き）Thompson シェルと互換性はありません。つまり Thompson シェル用のシェルスクリプトが Bourne シェルで実行できるわけではありません（`if` や `goto` を使ったコードなどが動かない）。

Bourne シェルは、公式には Version 7 Unix の一部として 1979 年にリリースされたことになっていますが、開発が始まったのは 1975 年の終わり頃（または 1976 年の初め頃）です。これは Bourne シェルの開発者である Stephen Bourne 本人が [BSDCan 2015](https://www.bsdcan.org/2015/schedule/events/612.en.html) およびその動画の [Stephen Bourne: Early days of Unix and design of sh](https://www.youtube.com/watch?v=2kEJoWfobpA) で語っています。スライドの 15 ページに書いてあるとおり、Bourne シェルは 1975 年の終わりごろに開発が始まり、最初のバージョンは 1976 年の初め頃に配布されました。

- Started writing code toward end of 1975
- First versions deployed in early 1976

残念ながら Version 7 Unix 以前の Bourne シェルの詳細な仕様は見つけられていませんが、初期のバージョンはずいぶんと文法が異なっていたようです。最初からすべての機能が完成していたわけではありませんが、スライドの 19 ページの Complete list from 1977 に書かれているように、1977 年時点で多くの機能が実装されています。

```
Complete list from 1977
• dynamic storage management (for variables &c.)
• control structures (at tty as well)
• parameter substitution + - ? =
• case pattern matching
• path searching
• built in file name matching (/etc/glob)
• no re-evaluation after $ substitution
• more general patterns (/sys/s?/...)
• general trap and fault handling
• control over child signals
• piping into or out of loops
• mail notification
• argument substitution eg nohup(a;b)
• efficient for loop and reads from files
• error recovery from sub command failure assured
• shell error handling can be controlled
• checks for cat >x >x and cat >x | wc
• cannot execute/cannot find distinguished
• general redirection e.g. 2>…
• input and execution traces; also no execution mode
• wait is interruptible
• cat >x hangs on open can be INTR’d
```

Bourne シェルは Version 7 Unix とともに開発が進められたため、Bourne シェルで必要になった環境変数が Unix の機能として加わりました。さまざまな試行錯誤を経て Bourne シェルで環境変数を扱う構文は 1978 年に完成したようです。Bourne シェルは 1976 年から実際の内部運用で使われながら改良が進められ、1979 年の Unix 7 Unix とともに公式リリースされたことがわかります。

Bourne シェルでは goto が削除されました。そのことについて以下のスレッドで Stephen Bourne と Ken Thompson と Douglas McIlroy がコメントしています。当時に goto が嫌われたていたこととはあまり関係なく自然な流れとしてそうなったようです。1976 年に出版された「[Software Tools](https://www.amazon.co.jp/dp/020103669X)」（日本語訳は 1981 年出版の「[ソフトウェア作法](https://www.amazon.co.jp/dp/4320021428)」）を見てもそうですが、世間一般の goto 論争をよそに、最先端のプログラマの間ではこの頃には構造化プログラミングはすでに常識のものとなっていたように思えます。

https://www.tuhs.org/pipermail/tuhs/2020-December/022614.html

以下のスレッドも Unix シェルの初期の歴史としていろんなことがわかります。

https://www.tuhs.org/pipermail/tuhs/2020-November/022489.html

https://www.tuhs.org/pipermail/tuhs/2020-December/022492.html

https://www.in-ulm.de/~mascheck/bourne/ には 1979 年以降に追加された機能として次のような機能が紹介されています。

```
· Version 7   (1979)  control structures, cmd substitution, () and {}, 
                      arbitrary variable names, trap, eval, 
                      special parameter substitutions, case
· System III  (1981)  #, [!...], colon parameter substitution, set --
· SVR1        (1983)  shift n
· SVR2        (1984)  functions, built-ins: unset echo type,
                      redirection for builtins
· SVR3        (1986)  modern "$@", 8-bit clean, getopts,
                      functions do not modify positional parameters
· SVR4.0      (1989)  job control
· SVR4.2      (1992)  read -r
```

Bourne シェルが広く公開された後に追加された重要な機能は、1982 年に実装（公開されたのは 1984 年）されたシェル関数です。Stephen Bourne はシェルに関数が必要ないと思っていたわけではなく、むしろその反対に「**なぜ最初からシェル関数を実装していなかったのか自分でもわからない**」といっているほど重要な機能です。その事実は動画および、[The A-Z of Programming Languages: Bourne shell](https://www.computerwoche.de/a/the-a-z-of-programming-languages-bourne-shell,1889199) で詳しく述べられています。

Bourne シェルはシェル言語の機能を最小限にし、本当にシェルで実装すべきこと（フロー制御やシェル変数やシェル関数など）だけを実装するようにしていました。そのため初期の実装は、文字列や数値を比較するための `test` コマンド（`if` でよく使用される `[ ... ]` ）や文字列処理や数値計算を行う `expr` コマンドは外部コマンドだったので C シェルよりも遅いと言われていました。しかし **`test` コマンドは 1981 年版の Bourne シェルに内蔵**され、Bourne シェルの後継として 1992 年に POSIX で標準化されたシェル（いわゆる POSIX シェル）では**数値計算も POSIX シェルの機能**となっているため、現在のシェルでは簡単な文字列処理や数値処理で外部コマンドは必要ありません。

## Cシェルの歴史（1977年頃に誕生）

C シェルは Thompson シェル、PWB シェル、Bourne シェルの 舞台である AT&T ではなく、カリフォルニア大学バークレー校 (UCB: University of California, Berkeley) で Bill Joy によって開発されたシェルです。Unix を開発した Ken Thmopson は 1975年に AT&T ベル研究所を休職し、母校のカリフォルニア大学バークレー校に赴任しました。その時に Version ６ Unix のインストールを手伝い、そこから BSD Unix の開発が始まります。

Bourne シェルと C シェルの開発の開始をいつと定めるのか難しいところですが、1975 年の終わりに Bourne シェルの開発を始めたのに対して、1975 年に Unix のインストールが行われている以上、C シェルの開発の開始が Bourne シェルより早いとは考えられないでしょう。ほとんど同じ時期に開発が行われており、Stephen Bourne は Bourne シェルが完成したすぐ後に C シェルが完成したと考えています（[参照](https://www.computerwoche.de/a/the-a-z-of-programming-languages-bourne-shell,1889199,7)）。

>  The C shell was done a little after I did the Bourne shell 

C シェルがいつ開発されたかについては tuhs でも話題になりましたが、結局のところソースコードから分かる範囲以上のことはわからなかったようです。

https://www.tuhs.org/pipermail/tuhs/2016-June/008545.html

その中で [Joerg Schilling のメール](https://www.tuhs.org/pipermail/tuhs/2016-June/008554.html) では 1977 年 9 月に C シェルが目標であるとの Bill Joy の記述が示されています。ただし、このことが man ページ書かれているとメールに書いてあるのですが、どこの man ページなのかはわかりませんでした。C シェルの名前の由来？が seashell （貝殻）にあるかもしれないことが、この man ページには記載されているので、これがどこに書いてあるのか見つけたいところです。

C シェルは 1977 年頃に ashell という名前で開発が行われていました。Bourne シェルが Thompson シェルのコードを利用していないのに対して、ashell は Thompson シェルのコードをベースに開発が始まっています。1976 年に Bourne シェルの初期バージョンが完成し、PWB シェルからの移行が行われつつある中で、BSD Unix では ashell の開発が行われていたことになります。1978 年 3月 の 1BSD には ashell が含まれており、いつしか C シェルへと名前が変更され 同 1978 年 5 月の 2BSD の一部として C シェルがリリースされます。C シェルは Thompson シェルがベースとなっており、構文が追加されてはいるものの（Bourne シェルとは異なり）Thompson シェルの上位互換シェルだったようです。

https://www.tuhs.org/cgi-bin/utree.pl?file=1BSD/ashell

https://www.tuhs.org/cgi-bin/utree.pl?file=2BSD/src/csh/


Clem Cole による C シェルに関するまとめでも、C シェルが Thompson シェルをベースにした ashell から始まったことが説明されています。

https://qr.ae/psEXPH

Bourne シェルと C シェルは開発の目的が違います。Bourne シェルの目的はコマンド言語をプログラミング言語（スクリプト言語）として使えるようにすることであり、そのために Thompson シェルをベースとせずに一から再設計されて作り直されました。一方で C シェルは対話シェルとして使いやすさを目的として Thompson シェルをベースに開発が始まったコマンド言語でした。Bourne シェルが対話シェルとしての機能を重視していなかったのは、そのような機能はシェルではなく別の場所（ターミナルドライバやウインドウマネージャなど）で実装するべき機能だと考えていたからです。Stephen Bourne は 1977 年頃に Bill Joy に「シェルにこんな機能を入れたいんだけど」と相談をされたことを[語っています](https://www.youtube.com/watch?v=2kEJoWfobpA&t=490s)。ここからも Bill Joy がシェルを開発し始めた頃にすでに Stephen Bourne が Bourne シェルを作っていたことがわかります。ちなみに OS の機能は Stephen Bourne の目論見どおりに進化しなかったため、後継の ksh では C シェル相当の対話機能がシェルに組み込まれました。

C シェルは Bourne シェルよりも後から開発が始まりましたが、Bourne シェルが含まれた Version 7 Unix よりも、先に 2BSD としてリリースされました。そのため Version 7 Unix で追加された環境変数の対応は、先にリリースされた C シェル は後から行われたようです。Unix と同時に開発していた Bourne シェルは最新の Version 7 Unix 用に設計されており、C シェルは Version 6 Unix をベースとした BSD Unix 用に設計されていたという違いがあります。

C シェルや PWB シェルについては「[Unix考古学](https://tatsu-zine.com/books/unix-archeology)」にも説明があります。「C シェルは PWB シェルが基になっている」や「PWB シェルは、スクリプトの記法を C プログラムの記述法と整合するという方針の下に開発が進められた」などという記述がありますが、そのことを補完する別の記事は見つけられませんでした。PWB Shell は、C プログラムのプロトタイピングにも活用されるようにもなったとありますが、C 言語と構文が全く違う上にポインタも関数もないのに、それが可能なのか懐疑的です。次のような文章が書かれていますが、推測止まりだと感じています。ただし `breaksw`、`endsw`、`onintr` などは、たまたま同じキーワードを選ぶ可能性が低いと感じるので、論文に触発されて C シェルの開発を始めたかはさておき、論文か実際の PWB シェルからキーワードを拝借した可能性は高いでしょう。

> 開発者であるJohn Mashey はMashey Shell について論文を発表していますが、Bill Joy はその論文に触発されてC Shell の開発に着手したといいます。当時のUniversity of California Berkeley（UCB）がPWB のライセンスを保持していたかどうかは定かではありませんが、Bill Joy が論文だけを手がかりに独自の実装でMashey Shell のシェルプログラミング機能の再現を試みたのが、C Shell の始まりであったと推測されます。C Shellのif-then-else-endif、break、breakaw、onintr、while-end などの構文は、Mashey Shellから直接影響を受けたものです。


調べてみて思ったのが、C シェルに関する初期の歴史を書いた記事があまり見つからないことです。Marshall Kirk McKusick によって書かれた 1986 年 1 月 15 に出版された「A BERKELEY ODYSSEY Ten years of BSD history」という記事で、C シェルの開発が始まる 1977 年頃のシェルの話が少しだけ書いてあります。

Berkeley_Unix_History.pdf
https://www.tuhs.org/Archive/Documentation/Unix_Review/

Bourne シェルは Version 7 Unix の一部として配布されため、どこでも使えるシェルでしたが、C シェルは主に BSD Unix 用のシェルでした。これが **「Bourne シェル用にシェルスクリプトを書けばどの環境でも動く」という現在でもたびたび耳にする神話**へとつながっています。実際には C シェルと比べた場合に、Bourne シェルはどの環境でも使えるシェルだったという程度の意味でしかなく移植性が高かったわけではありません。もちろん C シェルよりはマシですが、当初から異なるバージョンの Bourne シェルの間で互換性は保証されていませんでした。当時の基準ではそこそこ動けば移植性が高いと認識されていたと言うだけで、他のプログラミング言語の移植性が格段に向上した現代では、シェルスクリプトが移植性について問題を抱えていることは広く知られているとおりです。

## おまけ 「Bシェル」という日本独自の用語はいつ誕生したのか？

**補足 この記事のコメントも参照ください**

日本では Bourne シェルのことを「B シェル」と呼び、現在でさえ bash などを「B シェル系」と呼ぶことがあります。C シェルに対応して、こう呼ばれるようになったのだと思われますが、調べてみると海外で「B shell」という呼び方をしている例は限りなくゼロです。日本人が書いた本では使用されていますが、翻訳本では（日本語版での加筆を除いて）「B シェル」という用語は使われていないはずです。

私はいつ頃から「B シェル」という用語が使われるようになったのか興味があり調べています。現在見つけた中で最も古いものは 1985 年 12 月に出版された「[プロフェッショナル UNIX](https://www.amazon.co.jp/dp/4871481840)」です。この本よりも 1 年後になりますが、石田晴久さんによる 1986 年の 12 月の以下の文書でも「B シェル」という用語が使われています。

**UNIX システムの歴史と最近の動向 - 情報学広場 (1986) 石田晴久**

https://ipsj.ixsq.nii.ac.jp/ej/?action=pages_view_main&active_action=repository_view_main_item_detail&item_id=5514&item_no=1&page_id=13&block_id=8

この中の 2 ページ目に右上に「1975 年 5 月 B-shell 使用 [S.R. Bourne]」という記述があります。この記事で Bourne シェルの開発が始まったのは 1975 年の終わり頃と書きましたが、それよりも少し前の時期になっています。3 ページ目にはカタカナ表記の「B シェル」という記述もあります。

同じく、石田晴久著の 1983/11/01発売の「UNIX（共立出版）」には「B シェル」という用語は（見落としていなければ）使われていないようです。

https://www.kyoritsu-pub.co.jp/book/b10006555.html

> 本書の内容は、bit誌に、1981年10月号（Vol.13、No.11）から1983年3月号（Vol.15、No.3）にかけて、18回にわたって連載した記事に加筆修正を施したものである。

同書では Bourne シェルを指す用語として「シェル」「Shell」「標準 Shell」「sh」「Bourne-shell」という用語が使われています。珍しい用語としてシェルに相当する（Unix に限らない）OS の機能を「コマンドアナライザ」と言っていたりします。P103 の「UNIX コマンド・アナライザ Shell」では次のような文章があります。

> UNIX では，端末ユーザーが投入したコマンドを処理するプログラムすなわちコマンド・アナライザのことを Shell と呼ぶ．普通のオペレーティング・システム（OS）では，コマンド・アナライザは OS の一部をなすシステム・プログラムであるが，UNIX の Shell は単なるユーザ・レベルのプログラムである．

（中略）

> もちろん普通には標準の Shell が使われるが，それでは物足りないユーザーのために，バークレー版では後述の C-Shell と呼ばれる別のコマンド・アナライザが使われる．これと区別する必要のあるときには，標準コマンド・アナライザを設計者の名を取って Bourne-Shell と呼ぶことがある．この Shell は，コマンドを解釈しながら実行する一種のインタプリタである．

と、ここまで書いておきながら「B シェル」という用語が使われていないため、1983 年頃まではまだ「B シェル」という用語はなかったように思えます。おそらく 1984 年から 1985 年の間に普及したのではないでしょうか？ 時期を考えると ksh83 や ksh86 がすでに誕生していますが、（特に日本での）認知度は低かったように思えるので「C Shell」が頭文字を取って「"C" シェル」なら Bourne シェルも（？）頭文字を取って「"B" シェル」なんだろうという考えでつけられた気がします。C Shell は正式名称ですが、Bourne Shell の正式名称は B Shell ではありません。勝手に日本人が略したのでしょう。

現在のシェルは「B シェル系」と「C シェル系」の二通りではありません。Bourne シェル（B シェル）と C シェル系は使われなくなり、あるのはシェルごとに方言を持った「POSIX シェル系」と、全く異なるシェル言語を使う「POSIX シェル以外」です。

## さいごに

ということで初期の Unix シェルの歴史の話でした。後に Bourne シェルと C シェルについて調べたい人へのポインタは示せたかと。