Unixシェル

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

最も影響を与えたUnixシェルとしては、Bourne ShellとC Shellがある。Bourne Shellは単にshと呼ばれ、AT&Tでスティーブン・ボーンが開発し、UNIXで広く普及していたコマンドラインインタプリタである。パイプ、ヒアドキュメント、、変数、条件式やループといった制御構造、ワイルドカードによるファイル名指定などの機能が他の全てのUnixシェルに共通する機能の出発点となった。言語としては、ブロックの終りを逆から綴った（ファイル）キーワードで示すなど、ALGOL 68に影響を受けているRe: Late Bloomers Revisited USENET post to comp.lang.misc by Piercarlo "Peter" Grandi, Dept of CS, UCW Aberystwyth, UK, Dec 17, 1989.。

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の一部として配布されたHarley Hahn, Harley Hahn's Guide to Unix and Linux.。
 TENEX C shell (tcsh)
 Hamilton C shell: Nicole HamiltonがOS/2 (1988) と Windows (1992) 向けに開発Hamilton C shell for Windows Release Notes 4.0, retrieved June 19, 2010.。

 その他 
 es: Plan 9 from Bell Labs (Plan 9) のrcに基づいた関数型プログラミングのシェル（1990年代中ごろ）
 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シェルの設定ファイルについてまとめたものである。

shkshcshtcshbashzsh/etc/.loginloginlogin/etc/csh.cshrcyesyes/etc/csh.loginloginlogin~/.tcshrcyes~/.cshrcyesyes~/.tcshrc が見つからない場合のみ~/.loginloginlogin~/.logoutloginlogin/etc/profileloginloginloginlogin~/.profileloginloginlogin実際には ~/.bash_profile、~/.bash_login、~/.profile の順で最初に読み取り可能なファイルだけを読み込む。sh として呼び出されたときは ~/.profile のみを読み込む。login~/.bash_profilelogin~/.bash_loginlogin~/.bash_logoutlogin~/.bashrcint.+n/login/etc/zshenvyes/etc/zprofilelogin/etc/zshrcint./etc/zloginlogin/etc/zlogoutlogin~/.zshenvyes~/.zprofilelogin~/.zshrcint.~/.zloginlogin~/.zlogoutlogin

凡例:
 空白のマスは、そのシェルではそのファイルを全く読み込まないことを意味する。
 "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

Category:システム管理
*