
オペレーティングシステムシェルは、実行中のシステムへの比較的広範囲かつ直接的なアクセスを提供するコンピュータプログラムです。シェルという用語は、オペレーティングシステムの周囲にある比較的薄い層であることに由来します。 [ 1 ] [ 2 ]
ほとんどのシェルはコマンドラインインターフェース(CLI)プログラムです。一部のグラフィカルユーザーインターフェース(GUI)にもシェルが含まれています。
オペレーティングシステムは、ファイル管理、プロセス管理(アプリケーションの実行と終了)、バッチ処理、オペレーティングシステムの監視と構成など、ユーザーにさまざまなサービスを提供します。
ほとんどのオペレーティングシステムのシェルは、たとえシェルがコンピュータに直接接続された周辺機器を介してユーザーと通信する場合でも、基盤となるカーネルへの直接的なインターフェースではありません。シェルは実際には、他のアプリケーション プログラムが使用するのとまったく同じようにカーネルAPIを使用する特別なアプリケーションです。シェルは、ユーザーに入力を促し、その入力を解釈し、基盤となるオペレーティングシステムからの出力を処理することによって、ユーザーとシステムのやり取りを管理します (読み込み - 評価 - 出力ループ、REPLとよく似ています)。[ 3 ]オペレーティングシステムのシェルは実際にはアプリケーションであるため、ほとんどのオペレーティングシステムでは、別の同様のアプリケーションに簡単に置き換えることができます。
ローカル システムで実行されるシェルに加えて、リモート システムをローカル ユーザーが利用できるようにするさまざまな方法があります。このようなアプローチは通常、リモート アクセスまたはリモート管理と呼ばれます。当初は、シリアル ラインまたはモデムを介してメインフレームに接続されたテキスト ターミナルを使用して、アクティブな各ユーザーに同時にテキスト ベースの UI を提供するマルチユーザー メインフレームで利用可能だったリモート アクセスは、Unix ライクシステムや Microsoft Windows に拡張されました。Unix ライク システムでは、テキスト ベースのシェルには通常Secure Shell プロトコル (SSH)が使用されますが、 X Window Systemベースのグラフィカルユーザー インターフェイス (GUI) にはSSH トンネリングを使用できます。Microsoft Windows では、 Windows Vista以降、リモート デスクトップ プロトコルを使用して GUI リモート アクセスを提供できます。Windows 10ビルド 1809以降、 PowerShell Remoteも使用できます。SSH [ 4 ]は、WMI、RPC、および WS-Management [ 5 ]を介してテキスト ベースのリモート アクセスにも使用できます。
ほとんどのオペレーティングシステムシェルは、コマンドラインシェルとグラフィカルシェルの2つのカテゴリのいずれかに分類されます。コマンドラインシェルはオペレーティングシステムにコマンドラインインターフェイス(CLI)を提供し、グラフィカルシェルはグラフィカルユーザーインターフェイス(GUI)を提供します。あまり一般的ではありませんが、音声ユーザーインターフェイスや、テキストベースのメニューシステムなど、CLIではないテキストベースのユーザーインターフェイス(TUI)のさまざまな実装も存在します。CLIベースのシェルとGUIベースのシェルのどちらが優れているかは、しばしば議論の的となります。多くのコンピュータユーザーは、実行するタスクに応じて両方を使用します。
初期の対話型システムでは、常駐モニタの一部としてシンプルなコマンドラインインタープリタが提供されていました。このインタープリタは、 COMCONDEC TOPS-10システムなど、さまざまな名前で呼ばれていました。 [ 6 ]インタープリタは、あらかじめ定義された多数のコマンドのうちの 1 つを実行し、そのうちの 1 つはユーザー プログラムを実行するものでした。一般的なコマンドには、ユーザーをシステムにログオンおよびログアウトしたり、デバイスやファイルを割り当て、解放、操作したり、システムやユーザー プロセスに関するさまざまな情報を照会したりするものがありました。[ 7 ]
このような手順の目的は、あたかも別のプログラムの内部から呼び出されたかのように、あらゆる手順をアクティブ化できる交換媒体を作成することである。以降、便宜上、この手順を「シェル」と呼ぶことにする。
1964年、Multicsオペレーティングシステムにおいて、Louis Pouzinは「コマンドをプログラミング言語のように使う」というアイデアを思いつき、それを表現するためにシェルという用語を作り出した。[ 9 ] 1965年の文書では、シェルは「ユーザーがコンソールで何らかのメッセージを入力するたびに、コンソール制御下で他のプロセスがアクティブに実行されていないときに、スーパーバイザーによって自動的に呼び出される共通の手順」と定義されている。この手順は、コンソールメッセージと[スーパーバイザー内の]サブルーチンの間のインターフェースとして機能する。[ 8 ]このシステムは、 Glenda SchroederとGeneral Electricの匿名の人物によって最初に実装された。[ 9 ]
Multicsでは、後のいくつかのシェルで重要な概念となるアクティブ関数も導入されました。これは次のように定義されます。
文字列...これは、それを含むコマンドラインが実行される前に、文字列の戻り値に置き換えられます。アクティブ関数は、コマンド言語マクロを実装するためによく使用されます。[ 10 ]
1971年、ケン・トンプソンはUnixの最初のバージョンでトンプソンシェルを開発しました。マルチクスシェルよりもシンプルでしたが、入力と出力のリダイレクトに<と>を使用するなど、現代のシェルにも受け継がれている革新的な機能が含まれていました。
グラフィカルシェルは、ダグラス・エンゲルバートのNLSシステムに初めて登場し、1968年12月にサンフランシスコで開催された秋季合同コンピュータ会議でデモンストレーションされました。これは「すべてのデモの母」と呼ばれています。スタンフォード研究所のエンゲルバートの同僚たちは、このコンセプトをゼロックス・パロアルト研究所(PARC)に持ち込み、 1973年に発売されたAltoに搭載されました。そこから、このアイデアは1980年のニクラウス・ヴィルトのLilith、そして1983年のApple Lisaへと広がり、その後広く普及しました。


コマンドラインインターフェイス(CLI) は、キーボードで入力された英数字を使用してオペレーティングシステムに命令やデータを対話的に提供するオペレーティングシステムのシェルです。たとえば、テレタイプライターは、キーストロークを表すコードをコンピュータ上で実行されているコマンドインタープリタプログラムに送信できます。コマンドインタープリタはキーストロークのシーケンスを解析し、シーケンスを認識できない場合はエラーメッセージを返すか、アプリケーションプログラムのロード、ファイルのリスト、ユーザーのログインなど、他のプログラムアクションを実行します。UNIX などのオペレーティングシステムには、 POSIX シェルをベースラインとして、さまざまなコマンド、構文、機能を備えたシェルプログラムが多数あります。一部のオペレーティングシステムには、単一のスタイルのコマンドインターフェイスしかありませんでした。MS -DOSなどの汎用オペレーティングシステムには標準のコマンドインターフェイス ( COMMAND.COM ) が付属していましたが、メニューやリモートプログラム実行などの追加機能を提供するサードパーティのインターフェイスもよく利用されていました。
アプリケーションプログラムは、コマンドラインインターフェースを実装することもあります。例えば、Unix系システムでは、telnetプログラムにはリモートコンピュータシステムへのリンクを制御するためのコマンドが多数用意されています。プログラムへのコマンドは、リモートコンピュータに送信されるデータと同じキーストロークで構成されているため、両者を区別する何らかの手段が必要です。エスケープシーケンスを定義することで、決して転送されずに常にローカルシステムによって解釈される特別なローカルキーストロークを使用できます。プログラムはモード切り替えが可能になり、キーボードからのコマンドを解釈するか、キーストロークを処理対象データとして転送するかを切り替えることができます。
多くのコマンドラインシェルに共通する機能として、コマンドのシーケンスを保存して再利用できる機能があります。データファイルには、ユーザーが入力したかのようにCLIに実行させることができるコマンドのシーケンスを格納できます。CLIは、これらの保存された命令を実行する際に、特別な機能を使用する場合があります。このようなバッチファイル(スクリプトファイル)は、システムの再起動時に一連のプログラムを初期化するなど、ルーチン操作を自動化するために繰り返し使用できます。シェルのバッチモードの使用には、通常、構造、条件分岐、変数、およびその他のプログラミング言語の要素が含まれます。中には、このような目的に必要な最低限の機能しか備えていないものもあれば、それ自体が非常に高度なプログラミング言語であるものもあります。逆に、一部のプログラミング言語は、オペレーティングシステムのシェルから、または専用に作成されたプログラム内で対話的に使用できます。
Nushell、Xonsh、 Bash(Unixシェル)、Zシェルなど、いくつかのコマンドラインシェルはコマンドライン補完機能を提供しており、ユーザーが入力した数文字に基づいてインタープリタがコマンドを展開できるようになっている。[ 11 ]
コマンドラインインタープリタには履歴機能があり、ユーザーは以前にシステムに入力したコマンドを呼び出し、場合によっては編集して再度実行できます。オペレーティングシステムへのコマンドはすべてユーザーが入力する必要があったため、短いコマンド名とプログラムオプションを表すためのコンパクトなシステムが一般的でした。しかし、短い名前はユーザーにとって覚えにくい場合があり、初期のシステムには詳細なオンラインユーザーマニュアルを提供するための記憶容量が不足していました。
グラフィカルユーザーインターフェース(GUI)は、ウィンドウの開閉、移動、サイズ変更、ウィンドウ間のフォーカス切り替えといった操作を可能にすることで、プログラムをグラフィカルに操作するための手段を提供する。グラフィカルシェルはデスクトップ環境に付属している場合もあれば、独立したユーティリティ群として提供される場合もある。
ほとんどのグラフィカルユーザーインターフェースは、 「電子デスクトップ」というメタファーを採用しており、データファイルは机の上の紙の文書のように表現され、アプリケーションプログラムも同様に、コマンド名で起動されるのではなく、グラフィカルな表現で表示されます。

グラフィカルシェルは通常、ウィンドウシステムの上に構築されます。X Window SystemやWaylandの場合、シェルはそれぞれX ウィンドウマネージャまたはWayland コンポジタと、インストール済みアプリケーションの起動、開いているウィンドウや仮想デスクトップの管理、そして多くの場合ウィジェットエンジンのサポートといった機能を提供する 1 つまたは複数のプログラムで構成されます。GNOMEシェルとKDE Plasma は、 X Window System と Wayland 用のグラフィカルシェルです。
macOSの場合、Quartz Compositor がウィンドウ システムとして機能し、シェルはFinder [ 12 ]、Dock [ 12 ]、 SystemUIServer [ 12 ]、およびMission Control [ 13 ]で構成されています。
最新のバージョンの Microsoft Windows オペレーティングシステムは、シェルとしてWindows シェルを使用しています。Windows シェルは、デスクトップ環境、スタート メニュー、タスク バーに加え、オペレーティングシステムのファイル管理機能にアクセスするためのグラフィカル ユーザー インターフェイスを提供します。古いバージョンには、Microsoft Windows 3.x シリーズのシェルであったプログラム マネージャーも含まれており、実際には Windows XP まで、95 および NT タイプの後期バージョンの Windows に同梱されていました。Windows バージョン 1 と 2 のインターフェイスは大きく異なっていました。
デスクトップアプリケーションも、サードパーティ製のエンジンを使用している限り、シェルとみなされます。同様に、Windowsエクスプローラーのインターフェースに不満を持つ多くのユーザーや開発者が、シェルの機能や外観を変更したり、シェル自体を完全に置き換えたりするソフトウェアを開発してきました。StarDock社のWindowBlindsは前者の好例であり、LiteStepやEmerge Desktopは後者の好例です。
相互運用プログラムと専用ソフトウェアにより、Windowsユーザーは、後述する様々なUnixベースのGUIの多くに相当するものを、Macintoshと同様に利用できます。OS /2 Presentation Managerバージョン3.0に相当するものは、Windows NTの各バージョンに搭載されているOS/2環境サブシステムを使用することで、特定の条件下で一部のOS/2プログラムを実行できます。
シェルは通常、ユーザーインターフェースを介さずにsystem()、popen()などの標準システム関数を介してプログラム内から呼び出すこともできます。exec()
これらの標準機能に加えて、Windows は、プログラムが Windows シェルとやり取りするために使用できる一連の関数を公開する「Windows シェル API」を提供しています。これらのシェル関数は DLL (shell32.dll や shlwapi.dll など) で提供され、デフォルトの Windows シェル GUI (explorer.exe など) が実行されている必要はありません。Explorer.exe とその後継プログラムは、通常、Windows シェル API を使用して、Windows シェルのコア機能 (shell32.dll と shlwapi.dll によって実装および提供されています) を独自に実装することなく、ユーザーに Windows シェル GUI を提供します。しかし、プログラムは、ユーザーにシェル ユーザー インターフェイスを提供しない場合でも、他の目的で Windows シェル API を使用できます。
「シェル」という言葉は、自然界に見られる貝殻になぞらえて、ウェブブラウザや電子メールクライアントなど、特定のコンポーネントを中心に構築されたアプリケーションソフトウェアを指す場合にも広く使われます。実際、(コマンドライン)シェルはオペレーティングシステムのカーネルをカプセル化しています。これらは「ラッパー」と呼ばれることもあります。[ 2 ]
エキスパートシステムにおいて、シェルとは、特定のアプリケーションの知識ベースを持たない「空の」エキスパートシステムであるソフトウェアのことです。[ 14 ]
プージン氏は、ユーザーが面倒で反復的なコマンドを自動化するのに役立つRUNCOMというプログラムを作成しました。コンピューターの内部を囲む「シェル」と彼が表現したこのプログラムは、コマンドラインシェルと呼ばれるソフトウェアツールのクラス全体にインスピレーションと名前を与え、それは現代のオペレーティングシステムの表面下に今も潜んでいます。
PowerShell コマンド 1 つで、1 台または数百台のコンピューターでコマンドを実行できます。Windows PowerShell は、WMI、RPC、WS-Management などのさまざまなテクノロジーを使用してリモート コンピューティングをサポートします。