tee が不完全なデータを送信します。

tee が不完全なデータを送信します。
$ 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-nopipewarn回答のバリエーションと同様に、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ブロックを書き込む必要があります。

おすすめ記事