通常のシェルでは、ログインすると(何か他のものにカスタマイズして いない限り)'$' プロンプトを表示します。ここではシェルの文法や、 画面に表示されるものについては触れません。そのかわり、ここで起こ っていることの背景について、コンピュータの視点から考察してみます。
ブートも終わり、あなたがプログラムを起動しようとする前に思い出し ていただきたいことは、コンピュータの中には何かするべきことを待っ ているプロセスの一群がいるということです。それらはすべてイ ベント を待っています。イベントとは、あなたがキーを押したと かマウスを動かしたなどのできごとです。また、あなたのマシンがネットワ ークに接続されていれば、そのネットワークを通してそのマシンに入っ てきたデータパケットもイベントのうちの 1 つとなります。
カーネルもまたこれらのプロセスの仲間です。カーネルが特殊なのは、 その他のユーザプロセス が動作できるときにはそれらをコ ントロールし、また通常マシンのハードウェアに直接アクセスできるた だ 1 つのプロセスだからです。実際、ユーザプロセスは要求を作成して カーネルに伝えることにより、キーボード入力を取得したり、画面に書 き込んだり、ディスクの読み書きをしたりしなければならず、ただ 1 つ 自分でできることは、メモリの中でビット操作や計算をしたりすること くらいです。これらの要求は、システムコールとして知られ ています。
通常すべての I/O はカーネルを通して行われるので、カーネルは操作 のスケジューリングを行ったり、各プロセスがお互いに影響を及ぼさな いように守ってやることができます。ごく一部の特殊なユーザプロセス では、I/O ポートへの直接のアクセス権を持つことにより、カーネルの あずかり知らないところで動作することが許されるものもあります。こ れの一番典型的な例としては X サーバ(ほとんどの Unix マシンにおい て、他のプログラムの要求を処理してグラフィックス画面に描画するプ ログラム)があります。しかし我々はまだ X サーバまではたどりつい ていません。あなたはまだキャラクタ・コンソール上のシェル・プロン プトを見ているだけなのです。
シェルも単なるユーザプロセスの 1 つであり、別に特殊なものではあり ません。シェルは(カーネルを通して)キーボードの I/O ポートを監 視することによりキー入力を待ちます。キーが押されたことをカーネルが 検出すると、それらを画面にエコー(表示)すると同時にシェルに渡し ます。カーネルが `Enter' を検出すると、テキスト行をシェルに渡し ます。そしてシェルはそれらのキー入力をコマンドとして解釈し ようとします。
たとえば `ls' とタイプして Enter キーを押すと、Unix のディレクトリ一覧表示 機能が起動されます。シェルは内部に組み込まれている規則を適用して、あなたが `/bin/ls' ファイルというファイルに入っている実行可能コマンドを走らせようと していることを知ります。そしてシステムコールを発行して /bin/ls を新しい 子プロセスとして起動することをカーネルに対して要求し、カーネルを通 して画面とキーボードにアクセスする権限をその子プロセスに与えます。その後シェ ルはスリープし、ls が終わるのを待ちます。
/bin/ls は終了する際に exit システムコールを発行し て実行終了をカーネルに通知します。するとカーネルはシェルを起こし て(wake-up)動作を続行するよう指示します。シェルは次のプロンプト を発行して次の入力行を待ちます。
しかしながら、`ls' が実行されている間にあなたは別のことを行って もかまいません(たとえばあなたが、とても長いディレクトリのリスト を出しているとしましょう)。あなたは他の仮想コンソールに切り替 えてそこでログインし、Quake のゲームを始めてもよいのです。または、 あなたがインターネットに接続しているとしましょう。あなたのマシ ンは /bin/ls を実行しながらメールの送受信を行うこともできます。