Unixシェル
From Wikipedia, the free encyclopedia
Unixシェルは、Unix系オペレーティングシステムで用いられるコマンドラインシェルの総称である。

1970年代にUnix環境向けに設計されたコマンド解釈言語およびその処理系として成立し、以後のUnix系システムにおける標準的な操作手段およびスクリプト実行環境として位置づけられる。
システム管理、プログラム起動、処理自動化などに用いられ、パイプライン処理、入出力リダイレクト、制御構造を備えた独自のコマンド言語を特徴とし、その実装は多様な派生シェルを生んだ。
概念
「シェル」を最も広い意味で捉えれば、コマンドを入力するためにユーザーが使用するプログラムといえる。Unix系OSでは、対話型セッションのためのコマンドラインインタフェースには様々な選択肢がある。ユーザーがシステムにログインすると(GUI環境でない場合は)シェルプログラムが自動的に実行開始する。このログインシェルはユーザー毎にカスタマイズできる。passwdファイルで起動するシェルプログラムを指定でき、passwd -eコマンドまたはchshコマンドで変更することもできる。また、ユーザーは別のシェルプログラムを対話的に起動することもできる。
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の一部として開発された[1]。
- Yet another shell (yash): 2007年開発。C99で書かれており、POSIX.1-2008に完全に準拠している。
- Z Shell (zsh): 最も機能が豊富なシェル。sh、ash、bash、csh、ksh、tcshの上位互換相当の機能を持つ。macOS Catalina 10.15 以降のmacOSでデフォルトのシェルとされている[2]。
C Shell 互換
- C Shell (csh): ビル・ジョイがカリフォルニア大学バークレー校で開発。1978年にBSDの一部として配布された[3]。
- TENEX C shell (tcsh)
- Hamilton C shell: Nicole HamiltonがOS/2 (1988) と Windows (1992) 向けに開発[4]。
その他
- es: Plan 9 from Bell Labs (Plan 9) のrcに基づいた関数型プログラミングのシェル(1990年代中ごろ)[5]
- fish: 2005年リリース
- Perl Shell (psh): Unix系およびWindows向けのシェル。bashとPerlの機能を統合。
- pysh: IPythonプロジェクトの特殊プロフィール。Python用シェルとシステム用シェルをシームレスに統合[6]。
- rc: Plan 9 と Version 10 Unix でのデフォルトのシェル。Tom Duffが開発。各種Unix系OSにも移植されている。
- scsh: Schemeで書かれたシェル
- wish: Tcl/Tk用のウィンドウ型シェル(Tcl/Tkパッケージの一部)
- zoidberg: Perlのみで書かれているモジュール化されたシェル[7]
様々なシェルの一覧は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シェルの設定ファイルについてまとめたものである。
| sh | ksh | csh | tcsh | bash | zsh | |
|---|---|---|---|---|---|---|
/etc/.login |
login | login | ||||
/etc/csh.cshrc |
yes | yes | ||||
/etc/csh.login |
login | login | ||||
~/.tcshrc |
yes | |||||
~/.cshrc |
yes | yes[注釈 1] | ||||
~/.login |
login | login | ||||
~/.logout |
login | login | ||||
/etc/profile |
login | login | login | login | ||
~/.profile |
login | login | login[注釈 2] | login | ||
~/.bash_profile |
login[注釈 2] | |||||
~/.bash_login |
login[注釈 2] | |||||
~/.bash_logout |
login | |||||
~/.bashrc |
int.+n/login | |||||
/etc/zshenv |
yes | |||||
/etc/zprofile |
login | |||||
/etc/zshrc |
int. | |||||
/etc/zlogin |
login | |||||
/etc/zlogout |
login | |||||
~/.zshenv |
yes | |||||
~/.zprofile |
login | |||||
~/.zshrc |
int. | |||||
~/.zlogin |
login | |||||
~/.zlogout |
login |
凡例:
- 空白のマスは、そのシェルではそのファイルを全く読み込まないことを意味する。
- "yes" - そのシェルの起動時に必ず読み込む。
- "login" - そのシェルがログインシェルだった場合に読み込む。
- "n/login" - そのシェルがログインシェルでなかった場合に起動時に読み込む。
- "int." - 対話型のシェルとして起動した場合に読み込む。