パイプラインの実行後はコマンドのみがあります。このシナリオでは、パイプラインはどのように機能しますか?

パイプラインの実行後はコマンドのみがあります。このシナリオでは、パイプラインはどのように機能しますか?

次の2つの例では何が起こりますか?各パイプラインで2番目のコマンドだけが実行されるのはなぜですか?ここでパイプラインはどのように機能しますか?

実施例1

$ cat /var/log/messages | date
Mon Apr  8 17:10:02 IST 2019

実施例2

$ cat /var/log/messages | w
17:10:34 up 8 days,  1:24,  6 users,  load average: 0.63, 0.49, 0.61

答え1

両方の例の両方のコマンドは次のとおりです。処刑された。実際には、パイプ記号の後のコマンド出力のみが表示されます。

パイプでは/var/log/messages、ファイルの内容がパイプの左側で実行され、コマンド入力としてパイプされます。datecat

このdateコマンドは標準入力ストリームに興味がなく、そこに到着するすべてのデータを無視します。ただし、標準出力ストリームに独自の出力を生成します。

インターネット見えるその結果、 の出力はcat無視され廃棄されますが、 の出力はdate端末 (またはパイプされた出力が行くところ) に表示されます。

コマンドの出力で実際に起こるのは、コマンドが読み込まれないため、出力が読み込まれるのを待ってコマンドが一時的にブロックされるということcatです(パイプバッファが保持できるだけ正常に出力した後、いつ読み込まれるかわかります。ありません)。読んでください))。コマンドは操作を実行し、文字列を出力して終了します。datecatdatedate

この時点で、コマンドはdate終了し、標準入力ストリームが閉じられるとシェルから信号を受け取ります。この信号は、標準出力に書き込もうとするすべてのデータが決して読み取られず、終了することを示します(終了はこの信号のデフォルト動作です)。読み込んでいるファイルの残りの部分は決して読み取られず、パイプバッファのデータは、シェルが関連するメモリを解放すると削除されます。datecatPIPEcatPIPEcat

datew標準入力ストリームを読み取らない代替コマンドや他のコマンドでも同じことが起こります。

実際に使用されている命令と比較できます。する標準入力ストリームを読みます。

cat /var/log/messages | tr '[:lower:]' '[:upper:]'

またはパイプがない場合(catこれらの例ではパイプが実際には必要ないため)

tr '[:lower:]' '[:upper:]' </var/log/messages

答え2

パイプの動作方法は次のとおりです。左コマンドの出力が右コマンドの入力に送られます。

2 つのコマンドを順番に実行するには、セミコロンを使用します。

cat /var/log/messages ; date

最初のコマンドが成功した場合にのみ2番目のコマンドを実行するには、次のようにします&&

cat /var/log/messages && date

最初のコマンドが失敗した場合にのみ2番目のコマンドを実行するには、次のようにします||

cat /var/log/messages || date

バックグラウンドで最初のコマンドを実行し、同時に2番目のコマンドを実行するには、次のようにします。&

cat /var/log/messages & date

関連情報