上記のシェルスクリプト例では、プログラムシーケンスの実行方法を示しています。 lsはパイプを扱い、wcは引数ですか?それとも、どれを実行し、それが取る引数は何ですか?
回答:
回答№1の場合は3式 ls | wc
、シェルはおおよそ次のアクションを実行します。
- A "の標準出力をB"の標準入力に接続して、2つのサブシェルAとBを起動します。
- サブシェルAで、コマンドを開始します
ls
- サブシェルBで、コマンドを開始します
wc
- すべてのサブシェルが終了するまで待ちます
- セット
$?
サブシェルBの終了ステータス(つまり、wc
)
ザ bash
マンページに詳細があります:
パイプライン
パイプラインは、次のいずれかで区切られた1つ以上のコマンドのシーケンスです。 制御演算子
|
または|&
。パイプラインの形式は次のとおりです。[time [-p]] [ ! ] command [ [|│|&] command2 ... ]
の標準出力 コマンド パイプを介しての標準入力に接続されています command2。この接続は、リダイレクトの前に実行されます コマンドで指定(参照
REDIRECTION
以下)。もし|&
使用され、 コマンドの標準エラーが接続されています command2「標準入力 パイプを通して;それは略記です2>&1 |
。この暗黙の 標準エラーのリダイレクトは、リダイレクト後に実行されます コマンドで指定されます。パイプラインの戻りステータスは、最後のパイプラインの終了ステータスです コマンド、ただし
pipefail
オプションが有効になっています。もしpipefail
は 有効にすると、パイプラインの戻りステータスは最後の値です (右端)ゼロ以外のステータスで終了するコマンド、またはすべての場合はゼロ コマンドは正常に終了します。予約語の場合!
に先行する パイプライン、その終了ステータスパイプラインは、の論理否定です 上記の終了ステータス。シェルはすべてのコマンドを待ちます 値を返す前に終了するパイプラインで。もし
time
予約語はパイプラインの前にあり、経過時間も 実行に費やされるユーザーとシステムの時間は、 パイプラインが終了します。の-p
オプションは出力形式をそれに変更します POSIXで指定されています。のTIMEFORMAT
変数はフォーマットに設定できます タイミング情報の表示方法を指定する文字列。 の説明を参照してくださいTIMEFORMAT
以下のシェル変数の下。パイプラインの各コマンドは、個別のプロセスとして実行されます(つまり、 サブシェル)。
回答№2の場合は0
いいえ、lsはパイプ引数を処理しません。これはシェルによって行われます。
lsコマンドのstdoutの内容は、stdinからのwcの入力として取得されました。
ls [標準出力]| * [stdin] * wc -l
コマンドwcは、そのstdoutコンテンツを入力として取得します。
ここでは、両方のコマンドがシェルによって異なるプロセスとして実行されます。 つまり、両方のPIDが異なります。
この答えを確認するには、 ps | cat。 異なるプロセスcatとpsを見ることができます。
PID TTY TIME CMD
11695 pts/1 00:00:00 bash
12207 pts/1 00:00:00 ps
12208 pts/1 00:00:00 cat