私はこのようなことをしたい:
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つの文字列の最終出力順序のみ異なります)
答え2
結果がにパイプされて/dev/null
パイプが有効かどうかを示すため、許可された答えは私には明確ではありません。
値が渡されたことを確認する練習をするには、次のようにパイプされた値をcat
使用または使用できますtr
。
% echo foo | tee >(tr -d '\n') ; echo bar
foo
foobar
答え3
echo 'foo' | tee /dev/tty |other-program