次の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
、ファイルの内容がパイプの左側で実行され、コマンド入力としてパイプされます。date
cat
このdate
コマンドは標準入力ストリームに興味がなく、そこに到着するすべてのデータを無視します。ただし、標準出力ストリームに独自の出力を生成します。
インターネット見えるその結果、 の出力はcat
無視され廃棄されますが、 の出力はdate
端末 (またはパイプされた出力が行くところ) に表示されます。
コマンドの出力で実際に起こるのは、コマンドが読み込まれないため、出力が読み込まれるのを待ってコマンドが一時的にブロックされるということcat
です(パイプバッファが保持できるだけ正常に出力した後、いつ読み込まれるかわかります。ありません)。読んでください))。コマンドは操作を実行し、文字列を出力して終了します。date
cat
date
date
この時点で、コマンドはdate
終了し、標準入力ストリームが閉じられるとシェルから信号を受け取ります。この信号は、標準出力に書き込もうとするすべてのデータが決して読み取られず、終了することを示します(終了はこの信号のデフォルト動作です)。読み込んでいるファイルの残りの部分は決して読み取られず、パイプバッファのデータは、シェルが関連するメモリを解放すると削除されます。date
cat
PIPE
cat
PIPE
cat
date
w
標準入力ストリームを読み取らない代替コマンドや他のコマンドでも同じことが起こります。
実際に使用されている命令と比較できます。する標準入力ストリームを読みます。
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