`tee`と`bash`プロセスの交換順序

`tee`と`bash`プロセスの交換順序

私はこのコードです」コイン「最初:

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)

bashin と似ていますkshが、zshstdoutrevもへのパイプという点で異なります(sleep 1; cat)

echoteeサブシェルは同時に起動しますが、stdoutに書き込まれますrev(...)teefoo\n今後Pipe torevなので、何があってもパイプはrevwrites の後に作成されるので、oof最後にのみ配置できます。遅延は発生しません。teefoooofcat

出力したい場合rev いいえパイプを通って到達するには、以下を(sleep 1; cat)使用または実行できますzsh

{ echo foo 3>&- | tee >(rev >&3 3>&-) 3>&- | (sleep 1; cat) 3>&-; } 3>&1

この機能には、zsh次のことができる機能も組み込まれています。teemultios

echo foo > >(rev) > >(sleep 1; cat)

しかし:

echo foo > >(rev) | (sleep 1; cat)

の出力がrev通過しますcat(混乱してもこの場合は通過しませんecho foo >(echo bar) | (sleep 1; cat))。

答え2

bash1つのプロセスとパイプの代わりに2つのプロセスに置き換えてから、STDOUTを/ dev / nullにダンプすると、期待どおりに機能します。

echo foo | tee >(rev) >( sleep 1 ; cat ; ) > /dev/null ; sleep 1

出力:

oof
foo

メモ:

  • これ2位 sleep予防する」金持ちコマンドプロンプトの後に印刷されます。
  • 遅延数をsleep最適な値に減らす方が良いですが、その数がどのくらいかわかりません。 1少し遅いですが、常に動作しているようです。.01常に動作するわけではありませんが(つまり、出力は時々間違った順序で表示されます)、かなりうまく機能し.1ているようです。

関連情報