読みながら、grep、パイプ、一時停止

読みながら、grep、パイプ、一時停止
yes "test" | grep -m3 "test"

印刷

test
test
test

その後、終了します。これもこうだ

yes "test" | while read line; do echo $line; done | grep -m3 "test"

そして

yes "test" | while read line; do echo $line; done | grep -E "*" | grep -m3 "test"

しかし、

yes "test" | while read line; do echo $line | grep -E "*"; done | grep -m3 "test"

印刷

test
test
test

その後、中断されます。ここで何が起こっているのでしょうか?

答え1

存在する

はい「テスト」行を読みながら; echo $line完了| grep -m3 "test"
yes実行中のプロセス、ループを実行するシェルプログラムという4つのプロセスがあります。パイプの最後のプロセスは、3 回のマッチ後に終了し、入力パイプの読み取り端を閉じます。その後、パイプラインの各ステップが最終的に破損したパイプに書き込まれるため、パイプを早期に終了する一般的な方法でsチェーンを介して終了します。whilegrepgrepSIGPIPE

存在する

はい「テスト」行を読んでいます。 echo $ line | grep -E "*"完了|
3つのプロセスyes、すなわちシェルプログラムとgrep。ただし、シェルプログラムを実行するプロセスである2番目のプロセスは、継続的に2つのプロセスを作成します。もっと遠くサブプロセスの1つはタスクを実行しecho、もう1つは別のgrepインスタンスを実行します。SIGPIPE以下を送信するのは後者のプロセスです。いいえシェルプログラムを実行するプロセスです。結局、後者のプロセスは実際に破損したパイプに書き込むことです。

その結果、パイプラインの2番目のステップであるwhileループを実行するシェルは決してありませんそれ自体終了しSIGPIPEて実行し続け、サブパイプラインを生成し続けます。生成されたサブパイプはもちろん終了しますが、SIGPIPEループを実行するシェルではwhileいいえループを終了する理由です。

関連情報