Unixシェル

Unixシェルは、Unix系システムにおけるコマンドラインシェルである。ユーザーインターフェースとして対話的に利用したり複数のコマンド並べたシェルスクリプトを実行する。

最も影響を与えたUnixシェルとしては、Bourne Shell と C Shell がある。Bourne Shell は単に sh と呼ばれ、AT&Tでスティーブン・ボーンが開発し、UNIXで広く普及していたコマンドラインインタプリタである。パイプ、ヒアドキュメント、、変数、条件式やループといった制御構造、ワイルドカードによるファイル名指定などの機能が他の全てのUnixシェルに共通する機能の出発点となった。言語としては、ブロックの終りを逆から綴った (ファイル)キーワードで示すなど、ALGOL 68 に影響を受けている。

C Shell (csh) はビル・ジョイがカリフォルニア大学バークレー校の大学院生のときに開発した。C言語をモデルとして制御構造や式の文法を設計している。対話型シェルとして、ヒストリ機能、編集機構、エイリアス、ディレクトリスタック、チルダ記法、cdpath、ジョブコントロール、パスハッシングといった機能を導入した。

これら2つのシェルがベースとなって、様々なシェルが派生していった。

概念 
「シェル」を最も広い意味で捉えれば、コマンドを入力するためにユーザーが使用するプログラムといえる。Unix系OSでは、対話型セッションのためのコマンドラインインタフェースには様々な選択肢がある。ユーザーがシステムにログインすると（GUI環境でない場合は）シェルプログラムが自動的に実行開始する。このログインシェルはユーザー毎にカスタマイズできる。passwd ファイルで起動するシェルプログラムを指定でき、passwd -e コマンドまたは  コマンドで変更することもできる。また、ユーザーは別のシェルプログラムを対話的に起動することもできる。

Unixシェルが登場した当時、このようなプログラムは珍しかった。対話型のコマンド言語であると同時にスクリプト言語としても使え、システムの制御ファシリティとしてOS自体もそのスクリプトを使用している。シェルの考え方はUNIX以外にも広まっていった。

ウィンドウシステムを持つシステムでは、ユーザーがシェルを直接使わないことも多い。Unix系OSでは、システムの立ち上げスクリプト群がシェルスクリプトで書かれており、ウィンドウシステムの起動もインターネットへのアクセスのためのプログラム起動もその他の様々な機能の起動もそのようなスクリプトで行う。

初期のシェル

Bourne Shell 

Bourne Shell はスティーブン・ボーンがベル研究所で開発し、1977年ごろ Version 7 Unix の一部として配布され、当時のデファクトスタンダードであった。Unix系OSには必ず Bourne Shell かその互換シェルが含まれていた。コマンドとしての名称は sh で、UNIXのファイル階層では一般に /bin/sh というパスにある。/bin/sh は Bourne Shell と互換性がある機能拡張されたシェルへのソフトリンクまたはハードリンクである。POSIXでは標準のシェル機能として KornShell のサブセットを指定しており、現在はPOSIXシェルに置き換わったためBourne Shellは使われていない。

C Shell 

C Shell はビル・ジョイがカリフォルニア大学バークレー校でUnix系OSの一系統の元となったBSD向けに開発した。Version 6 Unixの Thompson shell をベースとしている。C言語をモデルとして構文規則を設計した。対話型の端末で使用することを第一に考えて設計されており、スクリプト言語としてはあまり使われない。C Shell には様々な対話用コマンドがある。

分類

Bourne Shell 互換 
 Bourne Shell (sh): スティーブン・ボーンがベル研究所で開発。1978年ごろ、Version 7 Unix の一部として配布され、その後も改良されていった。
 Almquist Shell (ash): Bourne Shell のBSDライセンス版として開発。小さいので、リソースが少ない環境でよく使われている。FreeBSD および NetBSD では ash をPOSIX準拠に改良したものが sh として使われている。
 Bourne-Again shell (bash): GNUプロジェクトの一環で Bourne Shell のオープンソース版として開発。多くのLinuxディストリビューションでデフォルトのシェルとされている。
 Debian Almquist shell (dash): DebianとUbuntuで ash の代替として使用。
 KornShell (ksh): がベル研究所で開発。
 Public domain Korn shell (pdksh): kshからの派生。
 MirBSD Korn shell (mksh): OpenBSDの /bin/ksh と pdksh の後継として MirOS BSD の一部として開発された。
 Yet another shell (yash): 2007年開発。C99で書かれており，POSIX.1-2008に完全に準拠している。
 Z Shell (zsh): 最も機能が豊富なシェル。sh、ash、bash、csh、ksh、tcsh の上位互換相当の機能を持つ。macOS Catalina 10.15 以降の macOS でデフォルトのシェルとされている。

C Shell 互換 
 C Shell (csh): ビル・ジョイがカリフォルニア大学バークレー校で開発。1978年に BSD の一部として配布された。
 TENEX C shell (tcsh)
 Hamilton C shell: Nicole Hamilton が OS/2 (1988) と Windows (1992) 向けに開発

その他 
 es: Plan 9 from Bell Labs (Plan 9) の rc に基づいた関数型プログラミングのシェル（1990年代中ごろ）
 Friendly interactive shell (fish): 2005年リリース
  (psh): Unix系およびWindows向けのシェル。bash と Perl の機能を統合。
 pysh: IPythonプロジェクトの特殊プロフィール。Python用シェルとシステム用シェルをシームレスに統合。
 rc: Plan 9 と Version 10 Unix でのデフォルトのシェル。Tom Duffが開発。各種Unix系OSにも移植されている。
 scsh: Schemeで書かれたシェル
 wish: Tcl/Tk用のウィンドウ型シェル（Tcl/Tkパッケージの一部）
 zoidberg: Perlのみで書かれているモジュール化されたシェル

様々なシェルの一覧は www.freebsd.org にある。

歴史的シェル 
 Thompson shell (sh): 最初のUnixシェル。ベル研究所のケン・トンプソンが開発。バージョン 1 (1971) から 6 (1975) までのUNIXの一部として配布された。現代から見れば非常に原始的である。一部の Ancient UNIX で利用可能だが、一般には使われていない。
 PWB shell または Mashey shell (sh): Thompson shell の改良版。ベル研究所の John Mashey らが改良を行った。1976年ごろ Programmer's Workbench UNIX の一部として配布された。

主なUnixシェルの設定ファイル 
シェルは様々な場面で設定ファイルを読み込むが、詳細はシェルの種類によって異なる。設定ファイルにはそのシェル向けのコマンド群が書かれており、ロードされると同時に実行される。実行ファイルの探索パスを指定する $PATH のような重要な変数を設定したり、シェルの振る舞いや見栄えを制御する変数を設定したりする。次の表は代表的なUnixシェルの設定ファイルについてまとめたものである。

凡例:
 空白のマスは、そのシェルではそのファイルを全く読み込まないことを意味する。
 "yes"  - そのシェルの起動時に必ず読み込む。
 "login" - そのシェルがログインシェルだった場合に読み込む。
 "n/login" - そのシェルがログインシェルでなかった場合に起動時に読み込む。
 "int." - 対話型のシェルとして起動した場合に読み込む。

脚注

注釈

出典

参考文献 
 — 各種シェルの歴史と使用法など

関連項目 
 シェル

外部リンク 
 Introduction to the Unix shell history (Softpanorama)
 Sven Mascheck. The Traditional Bourne Shell Family History and Development. Version 2009-02-12; Last accessed March 6, 2009
 Bourne shell, or sh (interview with Steve Bourne, Computerworld, March 5, 2009)
 Linux Shell Scripting Tutorial - A Beginner's handbook
 Different Shells in Linux

システム管理