シェル

シェル () はオペレーティングシステム（OS）があるような高機能なコンピュータにおいて、ユーザーのためにインタフェースを提供するコンピュータプログラムであり、オペレーティングシステムが提供する機能へのアクセスを提供する。他にも、この用語はゆるやかに応用されることもあり、特定のコンポーネントの周辺に構築された任意のソフトウェアを含むこともある。例えば、ウェブブラウザや電子メールクライアントはHTMLレンダリングエンジンの「シェル」といわれることがある。コンピュータシステムとユーザーの間にある「殻」であることから、このように呼ばれる。
概要.
大まかに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ユーザプロセスとして動作するもので、利用者の好みにより選択もできる（また内部実装の話としては、端末デバイス等が、そのようにしてシェルを独立したプロセスとして実装できるように機能が設計されている）。MS-DOSでも、あまり一般的ではないが、COMMAND.COM 以外の、フリーソフトによるシェルなどもある。なお、MS-DOSの起動時の設定ファイルである CONFIG.SYS において「SHELL=C:\COMMAND.COM」といったようにして設定されるファイルは、その設定項目名の通りシェルであることが多いが、ブートの最後に、最初のプロセスとして実行するプログラムを指定するものであって、例えばアニメなどの架空のOSの起動画面を再現するプログラムなど、シェルでないものを指定することもある。
（エキスパートシステムにおいては、特定用途の知識ベースを入れる前の「空の」エキスパートシステムをシェルと呼ぶ）
歴史.
最初のUnixシェルはケン・トンプソンが開発したThompson Shellである。その手本になったのがMulticsのシェルで、さらにその手本になったのがルイ・プザンがCTSS向けに開発したRUNCOMというプログラムである。
コマンドラインシェル.
内部コマンドと外部コマンド.
シェル自身が持つ機能に関係しており、シェル単体で処理が完結するコマンドが内部コマンドである。それに対し、他のプログラムにより実行されるコマンドが外部コマンドである。OSの外殻としてのシェルでは普通、外部コマンドを実行する機能は必須である。また、システムに異常がある場合、外部コマンドがほとんどあるいは全く使えなくなることもあるため、そういった場合に対処できるよう、外部コマンドで実装できるものでも内部コマンドが用意されることもある（Windowsのシェルは、MS-DOS時代にフロッピィディスクでの運用では外部コマンドが全く無いこともあったCOMMAND.COMの影響で、多数の機能を抱えており、一見では似ているUnix系のシステムに移行したユーザは、DIRコマンドに相当するlsコマンドなどすら外部コマンドであることに、しばしば戸惑う）。
コマンドラインシェルの機能.
以下の機能のそれぞれを持つものもあれば、持たないものもある。
シェルスクリプト.
多くのコマンドラインシェルが、対話的に利用するだけでなく、テキストファイルないしパイプからのテキストをコマンドとみなして処理できる。これにより、ある種のプログラミング言語のインタプリタのように利用できる。そのようなシェルスクリプトで利用する場合に便利な多くの機能は、対話的にも利用できることが多い（たとえば Bourne Shell ではそうなっている）。いっぽうで C Shell のように、設計時に対話的利用に重点が置かれすぎたため、シェルスクリプト・プログラミングが推奨されないとされているシェルもある（Csh Programming Considered Harmful）。逆にスクリプト言語としての設計が重視された Microsoft PowerShell のような例もある。あるいは、プログラミング言語のインタプリタとして、Lispなどの処理系でREPLと呼ばれるものもシェルに近い。
その他.
なお、Unixのシェルには「インタラクティブシェル」と「ログインシェル」という概念がある。インタラクティブモードは専ら対話的な利用のためのモード、非インタラクティブモードは専らシェルスクリプト実行のためのモードで、一般にそのシェル自身の入出力が端末か否かなどにより変化するが、利用できるコマンド等がこれらで変化するわけではない。codice_1 に codice_2 というオプションを付けると強制的にインタラクティブモードで起動されるが、主な違いは一部のシグナルを無視するようになること、というようなシステム的な違いである。
一方ログインシェルとは、端末などにおいてログインした直後などの、最初のプロセスとしてのシェルのことである。通常の利用法ではログインシェルはインタラクティブシェルだが、そうでないこともある。たとえば ssh のコマンドライン引数で指定されたコマンドを実行しているだけの、リモートマシンにおけるシェルはログインシェルだがインタラクティブではない。
具体例として bash の場合、インタラクティブシェルでは起動時に codice_3 を読み込み、ログインシェルでは起動時に codice_4 を読み込む。以上について理解が適切でなかったりすると、モードによる違いがあるように見えるかもしれない。
コマンドラインシェルの一覧.
Unixシェル.
歴史上有名なものやよく使われているUnixシェルとして、以下のものがある。
上述の一覧の一部は、DOSやWindowsでも利用可能であり、Unixとの相互運用性を様々なレベルで可能にする。主な例として、（sh, bash, ksh, csh, tclsh, rsh を利用可能）、、、Cygwin、、Interix などがある。Windows Services For Unix はほとんどのバージョンで KornShell と C Shell を提供しており、Perlもコマンドラインとして利用できる。
（上の段落の記述は、シェルのレベルではなく、それらのシステム上でOSのレベルでUnixを模擬するもの、システムコールを読み替えるもの、などを全て混同している）
Unixシェルは OS/2 や OpenVMS といった他のOSでの利用可能である。また、VMSのシェルであるもDOS、Windows、OS/2、Unix系OSで利用可能となっている。
DOSや Windows NT のシェルもUnix系システムで利用可能となっているバージョンがある。
プログラミング言語のシェル.
プログラミング言語処理系に対するコマンドラインインタプリタも、一種のシェルである。OS的な機能へのインタフェースを持つものもある。
グラフィカルシェル.
グラフィカルシェルは、グラフィカルユーザインタフェース（GUI）による and・or デスクトップ環境などといったGUI環境へのユーザインタフェースとしてのシェルである。コマンドラインシェルと違い、形態がそれほど明確には固まっていない。
たとえば、X Window Systemなどのグラフィックシステムなどを含んだかなり広い範囲を含んで捉えられることもあれば、GNOMEデスクトップ環境のGNOME Shellのように、その提供するUIのほとんどの機能は他のプログラムを通じて提供される本当にごく薄い「シェル」に徹しているものもある。また、X Window Systemの環境ではウィンドウマネージャをデスクトップ環境も兼ねたシェルとして使うこともあったり（Xウィンドウマネージャ）、Windows 3.x時代のプログラムマネージャや、Mac OSにおけるFinderのように、ランチャーやファイルマネージャがベースのグラフィカルシェルもある（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) がデフォルトのシェルであり、デフォルトでなくなった後もしばらくは残っていてシェルを切り替えることもできた。
などのデスクトップアプリケーションも、サードパーティのエンジンを使っているという意味でシェルと呼ばれることがある。同様に Windows Explorer のインタフェースに不満を持つ多くの個人や業者が機能や外観を変更するソフトウェアや代替のグラフィカルシェルを開発してきた。前者（外観改善）の好例として WindowBlinds がある。後者（代替）の例としては、、、 などがある。
相互運用プログラムや特定用途のソフトウェアにより、Windows上で後述のUnix系GUI環境を使用することもできる。また、Windows NT の一部バージョンにはOS/2サブシステムがあり、OS/2のプレゼンテーションマネージャと同等の環境を提供していた。
X Window System.
前述のようにグラフィカルシェルとして捉えられている範囲が一定していないため、ここではいくつかの類型に分類して示す。