シェル (英語: shell) とは、コンピュータプログラムの一種で、ユーザーへのインタフェースを提供するものを指す。オペレーティングシステム(OS)を持つ高機能なコンピュータにおいて、その機能への容易なアクセスを提供する。

Bashスクリーンショット

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

概要 編集

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

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

歴史 編集

コマンドラインシェル 編集

内部コマンドと外部コマンド 編集

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

コマンドラインシェルの機能 編集

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

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

シェルスクリプト 編集

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

その他 編集

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

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

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

コマンドラインシェルの一覧 編集

Unixシェル 編集

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

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

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

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

Unix以外 編集

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

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

  • LISP
    • REPL (Read-Eval-Print Loop)(文字通りにはLispにおけるreadとevalという関数と同様のものが必要だが、そうでないものがそう呼ばれていることも多い[要出典]
    • Common Lisp 用のSLIME英語版
  • BeanShell – Java用シェル
  • Firebug (Chromebug)[7] – JavaScript のシェル兼デバッガ環境(Firefoxプラグイン)
  • GMMLCMD - GML英語版Game Maker でのスクリプト言語)のシェル
  • irb – Rubyの対話版
  • JavaScript shell – この名前でJavaScriptの対話型実行を可能にするプログラムがいくつかある。[8]
  • PHPsh – PHP用シェル
  • Pythonの標準インタプリタはシェルモードでも起動可能
  • Wish (GUI) と tclsh (CLI) - Tcl/Tk用シェル。
  • Windows Script Host
  • 一部例外を除くTeX処理系 — 但し実行後すぐは“原稿読み取り態”という特殊な状態[注釈 1]にある為,\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 がある。後者(代替)の例としては、LiteStepSharpEEmerge Desktop などがある。

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

X Window System 編集

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

その他のプラットフォーム 編集

脚注 編集

注釈 編集

  1. ^ ファイル名を入力するとすぐにそのファイルの処理を開始する。これは引数を解釈できない(つまり$ tex foo.texというコマンドライン処理が行なえない)OS上で効率良く原稿を読み取らせることが目的だった。

出典 編集

  1. ^ 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 
  2. ^ Tom Van Vleck (1995年2月5日). “Unix and Multics”. Multicians.org. 2012年8月14日閲覧。
  3. ^ Louis Pouzin (2000年11月25日). “The Origin of the Shell”. Multicians.org. 2012年8月14日閲覧。
  4. ^ V6 Thompson Shell Port - History”. V6shell.org. 2012年8月14日閲覧。
  5. ^ http://harmful.cat-v.org/software/csh
  6. ^ https://pubs.opengroup.org/onlinepubs/9699919799/utilities/sh.html#tag_20_117_09
  7. ^ developer.mozilla.org/en/Setting_up_extension_development_environment
  8. ^ developer.mozilla.org/en/JavaScript_shells JavaScript shells

関連項目 編集

外部リンク 編集