シェル (英語: shell) とは、コンピュータプログラムの一種で、ユーザーへのインタフェースを提供するものを指す。オペレーティングシステム(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の起動画面を再現するプログラムなど、シェルでないものを指定することもある。

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

## 歴史

- Multicsのシェルが、RUNCOM(ルイ・プザンがCTSS向けに開発したプログラム)を手本として作られた。

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

## コマンドラインシェル

### 内部コマンドと外部コマンド

シェル自身が持つ機能に関係しており、シェル単体で処理が完結するコマンドが内部コマンドである。それに対し、他のプログラムにより実行されるコマンドが外部コマンドである。OSの外殻としてのシェルでは普通、外部コマンドを実行する機能は必須である。また、システムに異常がある場合、外部コマンドがほとんどあるいは全く使えなくなることもあるため、そういった場合に対処できるよう、外部コマンドで実装できるものでも内部コマンドが用意されることもある(Windowsのシェルは、MS-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)
  - Hamilton C shell - Microsoft Windows 向け
- Emacs shell (eshell)
- Friendly interactive shell (fish)
- rc shell (rc) – Plan 9 from Bell Labs および Unix 向け
- scsh (Scheme Shell)
- Stand-alone Shell (sash)
- BeanShell
- Rhino shell
- rsh - 各種システムで使用可能なリモートシェル。一部システムでは Restricted shell を意味する。
- psh - Perlベースの汎用シェル
- sqsh - 対話型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のシェルであるDCLもDOS、Windows、OS/2、Unix系OSで利用可能となっている。

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

### Unix以外

- 4DOS、4OS2、4NT – JP Software が開発販売していたMS-DOS、OS/2、Windows NT 用のシェル。後継の Take Command は互換性を保ちつつGUIを使用したシェルである。
- Amiga CLI/AmigaShell - AmigaOS本来のグラフィカルシェルである Workbench の代替となるコマンドライン方式のシェル
- BASIC-PLUS – RSTS/E
- CANDE MCS – バロースのOS MCP 上のシェル兼エディタ
- CCP (console command processor) – CP/Mのユーザインタフェース
- COMMAND.COM – MS-DOSのシェル。
- cmd.exe – OS/2、Windows CE、Windows NTのシェル。
- Commodore DOS Wedge – コモドール64のBASIC 2.0を拡張したもので、主なディスク操作の省略表現を使用可能
- DCL – 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という関数と同様のものが必要だが、そうでないものがそう呼ばれていることも多い)
  - Common Lisp 用のSLIME
- BeanShell – Java用シェル
- Firebug (Chromebug) – JavaScript のシェル兼デバッガ環境(Firefoxプラグイン)
- GMMLCMD - GML(Game Maker でのスクリプト言語)のシェル
- irb – Rubyの対話版
- JavaScript shell – この名前でJavaScriptの対話型実行を可能にするプログラムがいくつかある。
- PHPsh – PHP用シェル
- Pythonの標準インタプリタはシェルモードでも起動可能
- Wish (GUI) と tclsh (CLI) - Tcl/Tk用シェル。
- Windows Script Host
- 一部例外を除くTeX処理系 — 但し実行後すぐは“原稿読み取り態”という特殊な状態にある為,`\relax`という命令を実行することでコマンドラインインタプリタとして利用できるようになる。

## グラフィカルシェル

グラフィカルシェルは、グラフィカルユーザインタフェース(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)