標準出力とプロセスで「ティー」する最良の方法

標準出力とプロセスで「ティー」する最良の方法

私はこのようなことをしたい:

echo 'foo' | tee /dev/stdout > >(cat)

ここで、stdout はecho端末と cat プロセスに転送されます。これを行うより簡単な方法はありますか?

私がこれを実行したとき:

 echo 'foo' | tee >(echo 'bar')

何らかの理由で、「foo」はエコーされず、「bar」だけがエコーされます。なぜですか?

ベストアンサー1

示したように正確に行います。

somecommand | tee >(othercommand)

出力は入力および標準出力somecommandに書き込まれます。othercommand

プロセス交換の問題は、入力をecho 'bar'気にしないので、できるだけ早く出力して終了することです。その後、ユーティリティはそれに書き込もうとしますが、失敗し、標準出力に文字列を書き込む前に信号の受信で終了します。あるいは、データがプロセスの交換に書き込まれる時間がある可能性があります。この場合、 `と`は両方とも標準出力に印刷されるため、決定的ではありません。teeecho 'foo'barteePIPEteebarfoo

プロセス交換のコマンドが実際に送信されたデータを読み取っていることを確認する必要があります(そうでない場合は、データを転送するのはなぜですか?)。 ビリーおじさんがコメントで提案したように、これは、プロセス置換を使用して、例で簡単にクリーンアップすることができますcat >/dev/null(のデータに興味がないと仮定tee)。

echo 'foo' | tee >(cat >/dev/null; echo 'bar')

または

echo 'foo' | tee >(echo 'bar'; cat >/dev/null)

(2つのバリアントは2つの文字列の最終出力順序のみ異なります)

おすすめ記事