`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))。

おすすめ記事