/ /コマンド「ls |」の実行シーケンスは何ですかwc」-Linux、シェル、パイプ

コマンド "ls |"の実行順序は? wc " - linux、shell、pipe

上記のシェルスクリプト例では、プログラムシーケンスの実行方法を示しています。 lsはパイプを扱い、wcは引数ですか?それとも、どれを実行し、それが取る引数は何ですか?

回答:

回答№1の場合は3

ls | wc、シェルはおおよそ次のアクションを実行します。

  1. A "の標準出力をB"の標準入力に接続して、2つのサブシェルAとBを起動します。
  2. サブシェルAで、コマンドを開始します ls
  3. サブシェルBで、コマンドを開始します wc
  4. すべてのサブシェルが終了するまで待ちます
  5. セット $? サブシェル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