次のコマンドの効果を理解するのに問題があります。
yes | tee hello | head
私のラップトップでは、「hello」の行数は約36,000で、標準出力に表示されている10行よりはるかに多いです。
私の質問は次のとおりです
yes
、より一般的には、パイプラインのコマンドはいつ停止しますか?上記の2つの数字が一致しないのはなぜですか?
tee
パイプラインの次のコマンドで行が1つずつ渡されないためですか?
ベストアンサー1
:> yes | strace tee output | head
[...]
read(0, "y\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\n"..., 8192) = 8192
write(1, "y\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\n"..., 8192) = 8192
write(3, "y\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\n"..., 8192) = 8192
read(0, "y\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\n"..., 8192) = 8192
write(1, "y\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\n"..., 8192) = -1 EPIPE (Broken pipe)
--- SIGPIPE {si_signo=SIGPIPE, si_code=SI_USER, si_pid=5202, si_uid=1000} ---
+++ killed by SIGPIPE +++
からman 2 write
:
EPIPE
fd リードエンドが閉じたパイプまたはソケットに接続します。これが発生すると、書き込みプロセスもSIGPIPE信号を受信します。
したがって、プロセスは右から左に死にます。head
それ自体が終了し、tee
終了後にパイプに最初に書き込む試みで終了します。死んだ後もhead
同じことが起こります。yes
tee
tee
バッファがいっぱいになるまでパイプに書き込むことができます。ただし、ファイルに任意の内容を書き込むことができます。私のバージョンはファイルtee
に同じブロックを書いているようです。stdout
head
カーネルの読み取りバッファは8Kです。すべてを読みますが、これはジョブなので最初の10行だけを印刷します。