シェル

シェル (英語: 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シェルとして、以下のものがある。 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系システムで利用可能となっているバージョンがある。 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 では、System Software（あるいは単に "System"）と呼ばれていた Classic Mac OS 時代の、68k Macintosh 用のバージョン1から、2017年現在の現行版である macOS のバージョン10.13（High Sierra）に至るまで一貫して、Finder がグラフィカルシェルである。 現代の 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ウィンドウマネージャの記事も参照。単独で動作するものもあれば、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） [脚注の使い方] ^ ファイル名を入力するとすぐにそのファイルの処理を開始する。これは引数を解釈できない（つまり$ tex foo.texというコマンドライン処理が行なえない）OS上で効率良く原稿を読み取らせることが目的だった。 ^ British Computer Society (2005). The BCS glossary of ICT and computing terms. Pearson Education. p. 135. ISBN 0-13-147957-1. https://books.google.co.jp/books?id=g8Bds8ssYYgC&pg=PA135&dq=%22shell+is+a+piece%22+%22expert+system%22&hl=sv&redir_esc=y#v=onepage&q=%22shell%20is%20a%20piece%22%20%22expert%20system%22&f=false  ^ Tom Van Vleck (1995年2月5日). “Unix and Multics”. Multicians.org. 2012年8月14日閲覧。 ^ Louis Pouzin (2000年11月25日). “The Origin of the Shell”. Multicians.org. 2012年8月14日閲覧。 ^ “V6 Thompson Shell Port - History”. V6shell.org. 2012年8月14日閲覧。 ^ http://harmful.cat-v.org/software/csh ^ https://pubs.opengroup.org/onlinepubs/9699919799/utilities/sh.html#tag_20_117_09 ^ developer.mozilla.org/en/Setting_up_extension_development_environment ^ developer.mozilla.org/en/JavaScript_shells JavaScript shells POSIX 擬似端末 バッチファイル MS-DOS Shell IEコンポーネントブラウザ - Internet Explorer shell とも シェルスクリプト Unixシェル Bourne Shell自習テキスト