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チェーンを介して終了します。while
grep
grep
SIGPIPE
存在する
はい「テスト」行を読んでいます。 echo $ line | grep -E "*"完了|3つのプロセス
yes
、すなわちシェルプログラムとgrep
。ただし、シェルプログラムを実行するプロセスである2番目のプロセスは、継続的に2つのプロセスを作成します。もっと遠くサブプロセスの1つはタスクを実行しecho
、もう1つは別のgrep
インスタンスを実行します。SIGPIPE
以下を送信するのは後者のプロセスです。いいえシェルプログラムを実行するプロセスです。結局、後者のプロセスは実際に破損したパイプに書き込むことです。
その結果、パイプラインの2番目のステップであるwhile
ループを実行するシェルは決してありませんそれ自体終了しSIGPIPE
て実行し続け、サブパイプラインを生成し続けます。生成されたサブパイプはもちろん終了しますが、SIGPIPE
ループを実行するシェルではwhile
いいえループを終了する理由です。