シェルが標準入力またはスクリプトから読み取る各行はパイプと呼ばれ、ゼロ個以上のパイプ文字(|)で区切られた1つ以上のコマンドを含みます。読む各パイプについて、シェルはそれをコマンドに分割します。、パイプラインのI / Oを設定して実行します。各コマンドは次のとおりです。(図7-1):
- コマンドを固定メタ文字セット(SPACE、TAB、NEWLINE、;、(、)、<、>、)で区切られたトークンに分割します。|、そして&。トークンの種類には、単語、キーワード、I/O リダイレクタ、セミコロンが含まれます。
シェルがパイプを区切りコマンドで分割した後でさえ、
|
なぜ|
各コマンドのトークンを区切るメタ文字としてリストしますか?|
すべてのコマンドに表示できますか?Bashのマニュアルでは、bashシェルがパイプラインを実行するときにパイプラインの各コマンドを実行するためにサブシェルを分岐しています。
パイプラインの各コマンドに対して「各コマンドに対して次のことを行う」シェルは何ですか?そのコマンドに対して分岐したサブシェルですか、それとも元のシェルですか?
答え1
パイプ文字は、
|
引用符のない単語を終了するため、メタ文字です。これはシェル言語を理解しやすくするために必要です。シェルがパイプのさまざまなプロセスを生成する方法は標準化されておらず、実装ごとに異なります。
Bourne Shellは最初に1つを作成し、sub-shell
パイプライン内のすべてのプロセスの親プロセスになり、最終的にパイプラインで一番右のプログラムを起動します。この方法は他の方法よりも少ないコードを必要とし、タスク制御を簡単に実装できます。
Bashも同様の方法で動作します。
Ksh93は、パイプラインの各プロセスを元のシェルの直接サブプロセスにします。