$ head -c10G /dev/zero |
tee >(head -c1M | wc -c) >(head -c10M | wc -c) >(head -c100M | wc -c) >(head -c1000M | wc -c)
以下を提供します。
1048576
1064960
1064960
1064960
私は期待したでしょう:
1048576
10485760
104857600
1048576000
head -c1M
私はこれがパイプを閉じてtee
別のプロセスにブロックを書き込んだ後、最初のプロセスに書き込むことができないことを発見して終了するためだと思います。
tee
プライベート受信者をスキップして他の受信者に書き込みを続けるように依頼できますか?
ベストアンサー1
を使用する必要がありますtee --output-error=exit-nopipe
。これはSIGPIPE
信号を無視してEPIPE
エラーを記録しますが、他のエラーではまだ終了します。
tee --output-error=exit-nopipe
、warn
回答のバリエーションと同様に、1つ以上の出力に書き込めない場合は終了しますが、標準出力はその1つと見なされます。
あなたの例は出力をhead -c10G /dev/zero | tee ...
端末にダンプするのでバグがあります(ヌルバイトが「見えない」ために見えません)。これがすぐにtee
応答が終了しない理由です。>(...)
これは、プロセスの交換が終了した後もまだ書き込みによるものです。標準出力。
GNU teeがないシステムの場合、考えられる解決策はパイプするcat >/dev/null
コマンドにaを追加することです。しかし、すべてのコマンドに対してtee
それを行うことはできません。tee
失敗すると終了します。例:
$ dd if=/dev/zero |
tee >(dd of=/dev/null count=200; cat >/dev/null) >(dd of=/dev/null count=700; cat >/dev/null) |
dd of=/dev/null count=1000
$ dd if=/dev/zero |
tee >(dd of=/dev/null count=1000) >(dd of=/dev/null count=700; cat >/dev/null) |
{ dd of=/dev/null count=200; cat >/dev/null; }
両方とも200、700、および1000ブロックを書き込む必要があります。