私はこのコードです」コイン「最初:
echo foo | tee >(rev) | ( sleep 1 ; cat ; )
出力:
foo
oof
時間を増やしてもsleep
順序は変わりません。なぜ動作しないのですか?
他のツールに注意してくださいする期待通りに動作し、例えば:echo foo | pee rev 'sleep 1 ; cat'
。
答え1
存在する
echo foo | tee >(rev) | (sleep 1; cat)
bash
in と似ていますksh
が、zsh
stdoutrev
もへのパイプという点で異なります(sleep 1; cat)
。
echo
とtee
サブシェルは同時に起動しますが、stdoutに書き込まれますrev
。(...)
tee
foo\n
今後Pipe torev
なので、何があってもパイプはrev
writes の後に作成されるので、oof
最後にのみ配置できます。遅延は発生しません。tee
foo
oof
cat
出力したい場合rev
いいえパイプを通って到達するには、以下を(sleep 1; cat)
使用または実行できますzsh
。
{ echo foo 3>&- | tee >(rev >&3 3>&-) 3>&- | (sleep 1; cat) 3>&-; } 3>&1
この機能には、zsh
次のことができる機能も組み込まれています。tee
multios
echo foo > >(rev) > >(sleep 1; cat)
しかし:
echo foo > >(rev) | (sleep 1; cat)
の出力がrev
通過しますcat
(混乱してもこの場合は通過しませんecho foo >(echo bar) | (sleep 1; cat)
)。
答え2
bash
1つのプロセスとパイプの代わりに2つのプロセスに置き換えてから、STDOUTを/ dev / nullにダンプすると、期待どおりに機能します。
echo foo | tee >(rev) >( sleep 1 ; cat ; ) > /dev/null ; sleep 1
出力:
oof
foo
メモ:
- これ2位
sleep
予防する」金持ちコマンドプロンプトの後に印刷されます。 - 遅延数を
sleep
最適な値に減らす方が良いですが、その数がどのくらいかわかりません。1
少し遅いですが、常に動作しているようです。.01
常に動作するわけではありませんが(つまり、出力は時々間違った順序で表示されます)、かなりうまく機能し.1
ているようです。