私はこのようなことをしたい:
echo 'foo' | tee /dev/stdout > >(cat)
ここで、stdout はecho
端末と cat プロセスに転送されます。これを行うより簡単な方法はありますか?
私がこれを実行したとき:
echo 'foo' | tee >(echo 'bar')
何らかの理由で、「foo」はエコーされず、「bar」だけがエコーされます。なぜですか?
ベストアンサー1
示したように正確に行います。
somecommand | tee >(othercommand)
出力は入力および標準出力somecommand
に書き込まれます。othercommand
プロセス交換の問題は、入力をecho 'bar'
気にしないので、できるだけ早く出力して終了することです。その後、ユーティリティはそれに書き込もうとしますが、失敗し、標準出力に文字列を書き込む前に信号の受信で終了します。あるいは、データがプロセスの交換に書き込まれる時間がある可能性があります。この場合、 `と`は両方とも標準出力に印刷されるため、決定的ではありません。tee
echo 'foo'
bar
tee
PIPE
tee
bar
foo
プロセス交換のコマンドが実際に送信されたデータを読み取っていることを確認する必要があります(そうでない場合は、データを転送するのはなぜですか?)。 ビリーおじさんがコメントで提案したように、これは、プロセス置換を使用して、例で簡単にクリーンアップすることができますcat >/dev/null
(のデータに興味がないと仮定tee
)。
echo 'foo' | tee >(cat >/dev/null; echo 'bar')
または
echo 'foo' | tee >(echo 'bar'; cat >/dev/null)
(2つのバリアントは2つの文字列の最終出力順序のみ異なります)