このコードは「ウーフ" 初め:
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
と同様ですksh
が、 とは異なりzsh
、 の stdoutrev
も へのパイプです(sleep 1; cat)
。
echo
、、tee
およびrev
サブシェル(...)
は同時に起動されますが、stdoutにtee
書き込まれますfoo\n
前にパイプは に書き込まれるためrev
、いずれにしても は の書き込み後にパイプにrev
書き込まれるため、最後にしか来ません。遅延は発生しません。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
プロセス置換を 2 つ (1 つではなく、パイプ)使用し、STDOUT を /dev/null にダンプすると、期待どおりに動作します。
echo foo | tee >(rev) >( sleep 1 ; cat ; ) > /dev/null ; sleep 1
出力:
oof
foo
ノート:
- の2番目
sleep
防止する」フーコマンドプロンプトの後に「」が印刷されないようにする。 - 遅延数を最適な値まで減らすと
sleep
良いのですが、その数値が何であるべきかはわかりません。1
少し遅いですが、常に機能しているようです。.01
常に機能するとは限りませんが (つまり、出力が間違った順序になることがあります)、.1
うまく機能しているようです。