シェル

シェル  はオペレーティングシステムがあるような高機能なコンピュータにおいて、ユーザーのためにインタフェースを提供するコンピュータプログラムであり、オペレーティングシステムが提供する機能へのアクセスを提供する。他にも、この用語はゆるやかに応用されることもあり、特定のコンポーネントの周辺に構築された任意のソフトウェアを含むこともある。例えば、ウェブブラウザや電子メールクライアントはHTMLレンダリングエンジンの「シェル」といわれることがある。コンピュータシステムとユーザーの間にある「殻」であることから、このように呼ばれる。

1. 概要
-----

大まかに2種類に大別すると、キャラクタユーザインタフェースベースのコマンドラインインタプリタの形態をとる「コマンドラインシェル」と、グラフィカルユーザインタフェースベースでいわゆる「デスクトップメタファ」等の環境へのユーザインタフェースという形態をとる「グラフィカルシェル」に分けられる。

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の起動画面を再現するプログラムなど、シェルでないものを指定することもある。

2. 歴史
-----

最初のUnixシェルはケン・トンプソンが開発したThompson Shellである。その手本になったのがMulticsのシェルで、さらにその手本になったのがルイ・プザンがCTSS向けに開発したRUNCOMというプログラムである。

3. コマンドラインシェル
-------------

3.1. 内部コマンドと外部コマンド
------------------

シェル自身が持つ機能に関係しており、シェル単体で処理が完結するコマンドが内部コマンドである。それに対し、他のプログラムにより実行されるコマンドが外部コマンドである。OSの外殻としてのシェルでは普通、外部コマンドを実行する機能は必須である。また、システムに異常がある場合、外部コマンドがほとんどあるいは全く使えなくなることもあるため、そういった場合に対処できるよう、外部コマンドで実装できるものでも内部コマンドが用意されることもある。

3.2. コマンドラインシェルの機能
------------------

以下の機能のそれぞれを持つものもあれば、持たないものもある。

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

3.2.1. シェルスクリプト
---------------

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

3.3. その他
--------

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

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

具体例として bash の場合、インタラクティブシェルでは起動時に ~/.bashrc を読み込み、ログインシェルでは起動時に ~/.bash_profile を読み込む。以上について理解が適切でなかったりすると、モードによる違いがあるように見えるかもしれない。

4. コマンドラインシェルの一覧
----------------

4.1. Unixシェル
------------

歴史上有名なものやよく使われているUnixシェルとして、以下のものがある。

Bourne Shell 
Almquist Shell 
Debian Almquist shell 
Bourne-Again shell 
KornShell 
Z Shell 
Yet another shell 
C Shell 
TENEX C shell 
Hamilton C shell - Microsoft Windows 向け
Emacs shell 
Friendly interactive shell 
rc shell  – Plan 9 from Bell Labs および Unix 向け
scsh 
Stand-alone Shell 
BeanShell
Rhino shell
rsh - 各種システムで使用可能なリモートシェル。一部システムでは Restricted shell を意味する。
Perl Shell - Perlベースの汎用シェル
sqsh - 対話型SQLクライアントとしてデータベースアクセスも可能なシェル上述の一覧の一部は、DOSやWindowsでも利用可能であり、Unixとの相互運用性を様々なレベルで可能にする。主な例として、MKS Toolkit、UnxUtils、UWIN、Cygwin、DJGPP、Interix などがある。Windows Services For Unix はほとんどのバージョンで KornShell と C Shell を提供しており、Perlもコマンドラインとして利用できる。

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

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

4.2. 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  – CP/Mのユーザインタフェース
COMMAND.COM – MS-DOSのシェル。
cmd.exe – OS/2、Windows CE、Windows NTのシェル。
Commodore DOS Wedge – コモドール64のBASIC 2.0を拡張したもので、主なディスク操作の省略表現を使用可能
DIGITALコマンド言語 – 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 にある機能

4.3. プログラミング言語のシェル
------------------

プログラミング言語処理系に対するコマンドラインインタプリタも、一種のシェルである。OS的な機能へのインタフェースを持つものもある。

LISP系
REPL 
Common Lisp 用の
BeanShell – Java用シェル
Firebug  – JavaScript のシェル兼デバッガ環境
GMMLCMD - Game Maker Languageのシェル
irb – Rubyの対話版
JavaScript shell – この名前でJavaScriptの対話型実行を可能にするプログラムがいくつかある。
PHPsh – PHP用シェル
Pythonの標準インタプリタはシェルモードでも起動可能
Wish  と tclsh  - Tcl/Tk用シェル。
Windows Script Host
一部例外を除くTeX処理系但し実行後すぐは“原稿読み取り態”という特殊な状態にある為，lang=texという命令を実行することでコマンドラインインタプリタとして利用できるようになる。

5. グラフィカルシェル
------------

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

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

5.1. Mac OS
-----------

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

5.2. Microsoft Windows
----------------------

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

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

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

5.3. X Window System
--------------------

前述のようにグラフィカルシェルとして捉えられている範囲が一定していないため、ここではいくつかの類型に分類して示す。

ウィンドウマネージャ
uwm〜X11R3における標準
twm X11R4〜における標準
mwmMotifおよびCDEの標準
FVWM
qvwmWin95風ないしWin98風のデスクトップ画面を提供する
Blackbox
Fluxbox
Ratpoison
Xmonad
dwm
Beryl/Compiz
KDE環境用
KWin
GNOME環境用
Sawfish
Metacity
Mutter
デスクトップ環境
CDE
GNOME
KDE
Xfce
LXDE
Unity
デスクトップ環境のシェル
GNOME
GNOME パネル
GNOME Shell
KDE
KDesktop
Plasma
その他
Enlightenment
Cinnamon

5.4. その他のプラットフォーム
-----------------

Amigaの環境
Ambient 
Directory Opus
ScalOS
Wanderer 
Workbench
DOS Shell
OS/2の環境
Presentation Manager
ワークプレース・シェル

6. 脚注
-----

6.1. 注釈
-------

6.2. 出典
-------

7. 関連項目
-------

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

8. 外部リンク
--------

[1]