シェル

[thumb|right|300px|[Bashのスクリーンショット]]
**シェル**（）とは、主にUnix系オペレーティングシステム（OS）で発展した、OSと利用者との間に位置するプログラムであり、利用者の入力を解釈してOSの機能を呼び出す役割を担う。

1970年代のUNIXにおいて確立され、コマンド入力による対話的操作およびスクリプトによる処理自動化を可能にする。通常はカーネルとは独立して動作し、ファイル操作やプログラム実行などの処理を仲介する。転じて、特定の機能を包み込み外部との接点を提供するソフトウェアを指して「シェル」と呼ぶ場合もある。

## 概要
コマンドラインシェルとグラフィカルシェルの2種類の形態へ大別される：
* コマンドラインシェル：キャラクタユーザインタフェース (CUI) ベースのコマンドラインインタプリタ (CLI)
* グラフィカルシェル：グラフィカルユーザインタフェース (GUI) ベースでいわゆる「デスクトップメタファ」等の環境へのユーザインタフェース

CLIとGUIのどちらが優れているかという議論はしばしば行われている。CLI支持派は、特定の操作（ファイル群の移動など）を行う際にGUIよりもCLIの方が速いと主張する。また、CLIには複数のコマンドを組み合わせて素早く高度な処理を行えるとの主張もある。一方GUI支持派は、グラフィカルシェルの方がユーザビリティが高くシンプルだと主張する。しかし、用途により適するものは異なる。たとえばサーバ管理はリモートのことも多く、VNCなどでGUI画面を転送してネットワーク帯域を浪費することは好ましくなかったり、そもそもセキュリティポリシー的にそのような接続は禁止されることもある。一方で、たとえば画像や映像などのデータの開発や編集にはGUIの方が適している。少なくとも、多くのCLIにはソフトウェアの連携においてGUIを圧倒する柔軟性を持つパイプライン機能が備わっており、慣れれば短時間で既存のソフトウェアを繋ぎ合わせて高度な処理を記述できる事と、OSがクラッシュして最小構成でしか起動できなくなった場合にはCLIしか利用できない事から、システム開発・運用・管理の現場ではCLIスキルは重要視されている。

Multics以前のOSでは、シェル的なユーザインタフェースの機能はOS本体と渾然一体なものとして考えられ、そのように実装されていた（今日でも簡易なモニタ的なものではそういった設計も多い）。Multicsはシェルをモジュール化して独立させる設計を示した。UNIXもその影響をうけて設計され、シェルは単なる1ユーザプロセスとして動作するもので、利用者の好みにより選択もできる（また内部実装の話としては、端末デバイス等が、そのようにしてシェルを独立したプロセスとして実装できるように機能が設計されている）。DOSでも、あまり一般的ではないが、COMMAND.COM以外の、フリーソフトによるシェルなどもある。なお、DOSの起動時の設定ファイルであるCONFIG.SYSにおいて「SHELL=C:\COMMAND.COM」といったようにして設定されるファイルは、その設定項目名の通りシェルであることが多いが、ブートの最後に、最初のプロセスとして実行するプログラムを指定するものであって、例えばアニメなどの架空のOSの起動画面を再現するプログラムなど、シェルでないものを指定することもある。

（エキスパートシステムにおいては、特定用途の知識ベースを入れる前の「空の」エキスパートシステムをシェルと呼ぶ）

## 歴史
* Multicsのシェルが、RUNCOM（ルイ・プザンがCTSS向けに開発したプログラム）を手本として作られた。

* Unixシェルが、Multicsのシェルを手本として、ケン・トンプソンにより開発された（Thompson Shell）。

## コマンドラインシェル
### 内部コマンドと外部コマンド

シェル自身が持つ機能に関係しており、シェル単体で処理が完結するコマンドが**内部コマンド**である。それに対し、他のプログラムにより実行されるコマンドが外部コマンドである。OSの外殻としてのシェルでは普通、外部コマンドを実行する機能は必須である。また、システムに異常がある場合、外部コマンドがほとんどあるいは全く使えなくなることもあるため、そういった場合に対処できるよう、外部コマンドで実装できるものでも内部コマンドが用意されることもある（Windowsのシェルは、DOS時代にフロッピィディスクでの運用では外部コマンドが全く無いこともあったCOMMAND.COMの影響で、多数の機能を抱えており、一見では似ているUnix系のシステムに移行したユーザは、DIRコマンドに相当するlsコマンドなどすら外部コマンドであることに、しばしば戸惑う）。

### コマンドラインシェルの機能
以下の機能のそれぞれを持つものもあれば、持たないものもある。
* プログラム名（プログラム出力）を指定してアプリケーションを起動
* プログラムを終了する、フォアグラウンド・バックグラウンドを切り替えといった、ジョブ制御
* プログラムの出力をファイルに出力する（リダイレクト）、他のプログラムの入力とする、といったパイプ制御
* プログラムの動作環境の設定に使用する環境変数、シェル変数の設定・参照
* 入力コマンドライン中の特別な記法で指定した部分をファイル名としてパターンマッチさせて展開する機能（ワイルドカードの展開）
* 入力履歴を呼び出す（コマンド入力ヒストリ）
* コマンドに別名をつける（エイリアス）
* 繰り返しコマンドを実行したり、条件に応じて実行させたりするための制御構造
* 入力時のファイル名などの補完機能
* まとまった一連の入力をシェルスクリプトとして実行する（次節）

#### シェルスクリプト

多くのコマンドラインシェルが、対話的に利用するだけでなく、テキストファイルないしパイプからのテキストをコマンドとみなして処理できる。これにより、ある種のプログラミング言語のインタプリタのように利用できる。そのようなシェルスクリプトで利用する場合に便利な多くの機能は、対話的にも利用できることが多い（たとえばBourne Shellではそうなっている）。いっぽうでC Shellのように、設計時に対話的利用に重点が置かれすぎたため、シェルスクリプト・プログラミングが推奨されないとされているシェルもある（Csh Programming Considered Harmful）。逆にスクリプト言語としての設計が重視されたMicrosoft PowerShellのような例もある。あるいは、プログラミング言語のインタプリタとして、Lispなどの処理系でREPLと呼ばれるものもシェルに近い。

### その他
なお、Unixのシェルには「インタラクティブシェル」と「ログインシェル」という概念がある。インタラクティブモードは専ら対話的な利用のためのモード、非インタラクティブモードは専らシェルスクリプト実行のためのモードで、一般にそのシェル自身の入出力が端末か否かなどにより変化するが、利用できるコマンド等がこれらで変化するわけではない。`/bin/sh`に`-i`というオプションを付けると強制的にインタラクティブモードで起動されるが、主な違いは一部のシグナルを無視するようになること、というようなシステム的な違いである。

一方ログインシェルとは、端末などにおいてログインした直後などの、最初のプロセスとしてのシェルのことである。通常の利用法ではログインシェルはインタラクティブシェルだが、そうでないこともある。たとえばsshのコマンドライン引数で指定されたコマンドを実行しているだけの、リモートマシンにおけるシェルはログインシェルだがインタラクティブではない。

具体例としてbashの場合、インタラクティブシェルでは起動時に`~/.bashrc`を読み込み、ログインシェルでは起動時に`~/.bash_profile`を読み込む。

## コマンドラインシェルの一覧
### Unixシェル

歴史上有名なものやよく使われているUnixシェルとして、以下のものがある。
* Bourne Shell（sh）
** Almquist Shell（ash）
*** Debian Almquist shell（dash）
** Bourne-Again shell（bash）
** KornShell（ksh）
*** Z Shell（zsh）
** Yet another shell（yash）
* C Shell（csh）
** TENEX C shell（tcsh）
**  - Microsoft Windows向け
* Emacs shell（eshell）
* fish
* rc shell（rc） – Plan 9 from Bell LabsおよびUnix向け
* （Scheme Shell）
* （sash）
* BeanShell
* Rhino shell
* rsh – 各種システムで使用可能なリモートシェル。一部システムではRestricted shellを意味する。
*  – Perlベースの汎用シェル
*  – 対話型SQLクライアントとしてデータベースアクセスも可能なシェル

上述の一覧の一部は、DOSやWindowsでも利用可能であり、Unixとの相互運用性を様々なレベルで可能にする。主な例として、MKS Toolkit（sh、bash、ksh、csh、tclsh、rshを利用可能）、UnxUtils、UWIN、Cygwin、DJGPP、Interixなどがある。Windows Services For UnixはほとんどのバージョンでKornShellとC Shellを提供しており、Perlもコマンドラインとして利用できる。

UnixシェルはOS/2やOpenVMSといった他のOSでの利用可能である。また、VMSのシェルであるもDOS、Windows、OS/2、Unix系OSで利用可能となっている。

DOSやWindows NTのシェルもUnix系システムで利用可能となっているバージョンがある。

### Unix以外
* 、4OS2、4NT – JP Softwareが開発販売していた（それぞれ）DOS、OS/2、Windows NT用のシェル。後継のTake Commandは互換性を保ちつつGUIを使用したシェルである。
* Amiga CLI/AmigaShell - AmigaOS本来のグラフィカルシェルであるWorkbenchの代替となるコマンドライン方式のシェル
* BASIC-PLUS – RSTS/E
* CANDE MCS – バロースのOSMCP上のシェル兼エディタ
* CCP（console command processor） – CP/Mのユーザインタフェース
* COMMAND.COM – DOSのシェル。
* cmd.exe – OS/2、Windows CE、Windows NTのシェル。
* Commodore DOS Wedge – コモドール64のBASIC 2.0を拡張したもので、主なディスク操作の省略表現を使用可能
*  – OpenVMS用標準シェル。DECの初期のOSが発祥
* DDT – DEC製PDP-10用デバッガだが、MITのIncompatible Timesharing Systemでコマンドシェルとして使用
* DROS – Java MEプラットフォームをベースとしたスマートフォン向けのDOS風シェル
* EFIシェル – オープンソースのUnified Extensible Firmware Interfaceコマンドシェル
* Google Shell – Google検索のオンラインのフロントエンドで、UNIXシェル風に検索などが行える。
* iSeries QSHELL – IBM OS/400でのUNIX風シェル
* Macintosh Programmer's Workshop – Classic Mac OSでソフトウェア開発に使われていたコマンドライン環境
* Microsoft BASIC – かつての8ビットコンピュータでよく採用されていたオペレーティング環境
* REXX – IBMのスクリプト言語
* Singularity shell – Singularity用標準シェル
* Windows PowerShell – cmd.exeの後継のオブジェクト指向型シェル
* YouShell – YouOSのJavaScriptベースのコマンドプロセッサ
* 回復コンソール – Windows 2000、Windows XP、Windows 2003にある機能

### プログラミング言語のシェル

プログラミング言語処理系に対するコマンドラインインタプリタも、一種のシェルである。OS的な機能へのインタフェースを持つものもある。
* LISP系
** REPL（Read-Eval-Print Loop）- Lisp方面での原義としては、read(パーズ)し、データ化したフォームをeval(評価)し、結果をprintすることを繰り返す(loop)、トップレベルと呼ばれる対話環境である。Lispとは違いreadとevalが分離していないような言語でもREPLと呼称する意義は薄い。
*** SLIME - Common LispのREPLを強化したもの。リモート接続なども可能。
*** nREPL (Network REPL) - Clojureの強化されたREPL環境
* BeanShell – Java用シェル
* Firebug（Chromebug） – JavaScript のシェル兼デバッガ環境（Firefoxプラグイン）
* GMMLCMD - （Game Makerでのスクリプト言語）のシェル
* irb – Rubyの対話版
* JavaScript shell – この名前でJavaScriptの対話型実行を可能にするプログラムがいくつかある。
* PHPsh – PHP用シェル
* Pythonの標準インタプリタはシェルモードでも起動可能
* Wish（GUI）とtclsh（CLI） – Tcl/Tk用シェル。
* Windows Script Host
* 一部例外を除く処理系但し実行後すぐは“原稿読み取り態”という特殊な状態にある為、という命令を実行することでコマンドラインインタプリタとして利用できるようになる。

## グラフィカルシェル
グラフィカルシェルは、グラフィカルユーザインタフェース（GUI）によるand・or デスクトップ環境などといったGUI環境へのユーザインタフェースとしてのシェルである。コマンドラインシェルと違い、形態がそれほど明確には固まっていない。

たとえば、X Window Systemなどのグラフィックシステムなどを含んだかなり広い範囲を含んで捉えられることもあれば、GNOMEデスクトップ環境のGNOME Shellのように、その提供するUIのほとんどの機能は他のプログラムを通じて提供される本当にごく薄い「シェル」に徹しているものもある。また、X Window Systemの環境ではウィンドウマネージャをデスクトップ環境も兼ねたシェルとして使うこともあったり（Xウィンドウマネージャ）、Windows 3.x時代のプログラムマネージャや、Mac OSにおけるFinderのように、ランチャーやファイルマネージャがベースのグラフィカルシェルもある（Windows shell（:en:Windows shell）も、プログラム自体はExplorerである）。

### Mac OS

Mac OSでは、System Software（あるいは単に"System"）と呼ばれていたClassic Mac OS時代の、68k Macintosh用のバージョン1から、2017年現在の現行版であるmacOSのバージョン10.13（High Sierra）に至るまで一貫して、Finderがグラフィカルシェルである。

### Microsoft Windows
現代のMicrosoft WindowsのシェルはWindows shellである。ファイルマネージャとしてのWindows Explorerの他、デスクトップ環境（スタートメニュー、タスクバー等）を含めた全体を指してWindows shellという用語が使われている。古いバージョン（Windows 3.x、NT 3.x）ではプログラムマネージャ（progman.exe）がデフォルトのシェルであり、デフォルトでなくなった後もしばらくは残っていてシェルを切り替えることもできた。

iTVmediaPlayerなどのデスクトップアプリケーションも、サードパーティのエンジンを使っているという意味でシェルと呼ばれることがある。同様にWindows Explorerのインタフェースに不満を持つ多くの個人や業者が機能や外観を変更するソフトウェアや代替のグラフィカルシェルを開発してきた。前者（外観改善）の好例としてWindowBlindsがある。後者（代替）の例としては、LiteStep、SharpE、Emerge Desktopなどがある。

相互運用プログラムや特定用途のソフトウェアにより、Windows上で後述のUnix系GUI環境を使用することもできる。また、Windows NTの一部バージョンにはOS/2サブシステムがあり、OS/2のプレゼンテーションマネージャと同等の環境を提供していた。

### X Window System
前述のようにグラフィカルシェルとして捉えられている範囲が一定していないため、ここではいくつかの類型に分類して示す。
* ウィンドウマネージャ（Xウィンドウマネージャの記事も参照。単独で動作するものもあれば、GNOMEやKDEの環境が前提のものもある）
** uwm（:en:Ultrix Window Manager）〜X11R3における標準
** twm X11R4〜における標準
** mwm（:en:Motif Window Manager）MotifおよびCDEの標準
** FVWM
** qvwm（:en:Qvwm）Win95風（qvのqを9、vは5の意）ないしWin98風（漢数字の八を上下ひっくり返すとv）のデスクトップ画面を提供する
** Blackbox
** Fluxbox
** Ratpoison
** Xmonad
** dwm
** Beryl/Compiz
** KDE環境用
*** KWin
** GNOME環境用
*** Sawfish（:en:Sawfish (window manager)、〜GNOME2.2）
*** Metacity（GNOME2.2〜GNOME2.x）
*** Mutter（GNOME3〜）
* デスクトップ環境
** CDE
** GNOME
** KDE
** Xfce
** LXDE
** Unity（著名なゲームフレームワークとは無関係）
* デスクトップ環境のシェル
** GNOME
*** GNOME パネル（GNOME 2）
*** GNOME Shell（GNOME 3）
** KDE
*** KDesktop（:en:KDesktop、〜 KDE 3）
*** Plasma（KDE 4 〜）
* その他
** Enlightenment（デスクトップ環境と言えるほどにまで拡張されたウィンドウマネージャ）
** Cinnamon（GNOME Shellからのフォークで、GNOME3のようにGTK+3ベースだが、GNOME3と違いごく軽量なデスクトップ環境を提供することが目標）

### その他のプラットフォーム
* Amigaの環境
** Ambient（MorphOS）
** Directory Opus
** ScalOS
** Wanderer（AROS）
** Workbench
* DOS Shell
* OS/2の環境
** Presentation Manager（OS/2 1.1およびそれ以降、eComStation）
** ワークプレース・シェル（OS/2 2.0およびそれ以降、eComStation、ArcaOS）

## 脚注

### 注釈

### 出典

## 関連項目
* POSIX
* 擬似端末
* バッチファイル
* MS-DOS Shell
* IEコンポーネントブラウザ - Internet Explorer shellとも
* シェルスクリプト
* Unixシェル