出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2024/03/08 16:38 UTC 版)
| 作者 | スティーブン・ボーン |
|---|---|
| 初版 | 1977年 |
| 対応OS | UNIX |
| 種別 | Unixシェル |
Bourne Shell(ボーンシェル)は、Unix Version 7 のデフォルトシェルでUnixで使われていたUnixシェルの一つである。POSIX規格で規定されるUnix系システムではBourne Shell後継のPOSIX準拠のシェルに置き換わっており、POSIXに準拠していないBourne Shellはすでに使われていない。/bin/shはかつてはBourne Shellだったが、現在はPOSIXシェルへのシンボリックリンクかハードリンクになっている。多くのUnix系システムでは現在でもシェルスクリプトを記述するのに/bin/shが一般的に使われている。ただし、ユーザが通常使うシェルにはインタラクティブに適したPOSIX準拠シェルを用いることが一般的である。
AT&Tベル研究所のスティーブン・ボーンが開発し、それまでの Thompson shell を置き換えた。いずれもコマンド名は sh である。Version 7 Unix の一部として1977年に大学等に配布された。対話型のコマンドインタプリタとしても使われるが、スクリプト言語としての性格が強く、一般に構造化プログラムを作り出すと考えられている全ての機能を含んでいる。
ブライアン・カーニハンとロブ・パイクによる『UNIXプログラミング環境』の出版が Bourne Shell の人気を高めた。これはチュートリアル形式でプログラミング言語としてのシェルを紹介した最初の商業出版本である。
Bourne shell は Mashey shell の代替として設計された。
当初の設計目標には、以下の事柄が含まれていた[1]。
UNIX Version 7 での Bourne Shell の機能と特徴を以下に挙げる:
`command`<< を使ったヒアドキュメント(Here documents)機能。スクリプト内に埋め込まれたテキストブロックを入力として使う。for ~ do ~ done" ループ。特に、$* を使って引数列上をループする方法。case ~ in ~ esac" による選択機構。主に引数解析に使われる。sh は、環境変数を使ってエクスポート可能なキーワードパラメータや変数を実現している。また、Bourne Shell はエラーメッセージのために 2番のファイル記述子を使うという規定を最初に採用したプログラムでもある。これにより、エラーメッセージをデータと分離してスクリプトで制御することが容易になった。
スティーブン・ボーンは自身がケンブリッジ大学で関わっていた ALGOL 68C コンパイラのいくつかの特徴をこのシェルに取り込んだ。例えば、"if ~ then ~ else ~ fi"、"case ~ in ~ out ~ esac"、"for ~ while ~ do ~ od" といった構文である。さらに Version 7 のシェルはC言語で記述されているが、ボーンはそのソースコードをALGOL68風にするためにいくつかのマクロ[2]を使っている。このマクロは、IOCCCが開催される元の1つとなった(他に、4.2BSDの finger コマンドも元になっている)[3]。
数年の内に AT&T は Bourne Shell を強化した。各バージョンは対応する AT&T UNIX のバージョン名で呼ばれる(主なバージョンは Version 7、SystemIII、SVR2、SVR3、SVR4)。というのも、シェルはバージョン番号が付与されていないからでもあり、区別するには実際に機能をテストしてみる必要があった[4]。
1979年以降のバージョンの Bourne shell の機能(や特徴)を以下に示す[5]。
サンがOpenSolarisの中の Bourne Shell の派生版をオープンソースとしてリリースすると、他のフリーなUNIX系OS向けにこれを移植するHeirloomプロジェクトが開始され、利用可能となっている。Solaris や SVR4 の Bourne shell はオリジナルの ALGOL 68 風のソースコードではない。
Bourne shell は、C Shell と比べて次のような欠点があると批判されてきた[6][7]。
test と expr というユーティリティを使わないと式を評価できない。Bourne shell ではなく Thompson shell から派生した C Shell (csh) は 4.1BSD で配布され、BSDカーネルの「ジョブ制御」機能を導入した。ジョブ制御は対話的にプログラムを止めたり、後でそれを再開させる機能である[8]。C Shell がコマンドインタプリタとして人気になったのはこの機能があったためである。また C Shell は C言語風の文法を採用したことにより Bourne Shell と互換性がなくなってしまった。なお、ジョブ制御機能は後に Bourne shell にも導入され、その後継シェルの多くにも採用されている。
後にデビッド・コーンが開発した KornShell (ksh) は、Bourne Shell と C Shell の中間のようなもので、文法はほぼ Bourne Shell と同一で、ジョブ制御機能を C Shell から取り入れた。当初の KornShell (ksh88)の機能はPOSIXにおけるシェル標準の基盤となっている。その後、ksh93 が 2000年にオープンソース化され、いくつかのLinuxディストリビューションで使われている。ksh88 のクローン pdksh もあり、OpenBSDのデフォルトシェルとなっている。
Bash (Bourne Again Shell)は、その名が示す通り Bourne Shell を基本として C Shell や KornShell の機能を取り入れ、GNUプロジェクトの一部として開発された。macOS、Cygwin、多くのLinuxディストリビューションでデフォルトシェルとなっている。
rcは、ベル研究所のトム・ダフが Version 10 Unix での sh の後継として開発した。Plan 9 from Bell Labs ではデフォルトシェルとされている。Plan 9 from User Space の一部としてUNIXにも移植されたことがある。
かつてCSRGのBSDリリースでも使われた Bourne Shell には著作権問題がまとわりついていた。そこで Kenneth Almquist が Almquist Shell とも呼ばれる Bourne Shell のクローンを開発した。これはBSDライセンスで提供されていて、現在もBSD系でメモリ容量が小さい場合などに使われている。Linux にも移植され Debian Almquist shell または dash と呼ばれている。メモリ使用量が小さいため、シェルスクリプトの実行が bash よりも高速という特徴がある。
Bourne shell は全ての商用UNIXシステムで標準とされているが、BSD系のシステムには C Shell で書かれたスクリプトが多数存在する。Bourne shell のスクリプトは GNU/Linux や他のUnix系システム上の bash や dash でもほとんど実行可能である。
多くのLinuxシステムで、/bin/sh はbashへのハードリンクまたはシンボリックリンクとなっている。しかしUbuntuなどのLinuxシステムでは効率がよいことから /bin/sh を dash へのリンクとしている。
誰も Bourne shell の文法がどうなっているかを本当には知らない。ソースコードを調べてみてもほとんど役に立たない。 — Tom Duff[9]
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/07/30 00:52 UTC 版)
「エスケープ文字」の記事における「Bourne Shell」の解説
Bourne Shell (sh) では、アスタリスク (*) と疑問符 (?) がワイルドカードとして使用される。エスケープ文字を使わないと、*はカレントディレクトリの全てのファイルのファイル名に展開される。"*"というファイル名を指したい場合は、バックスラッシュ(\)を前につける。例えば、バックスラッシュをつけない場合とつけた場合で、以下のように動作が変わる。 rm * # カレントディレクトリの全てのファイルを消去するrm \* # * という名前のファイルを消去する
※この「Bourne Shell」の解説は、「エスケープ文字」の解説の一部です。
「Bourne Shell」を含む「エスケープ文字」の記事については、「エスケープ文字」の概要を参照ください。