特定のタスクを実行する一連のコマンドを設計しているときに、匿名パイプが期待どおりに動作しないという問題に遭遇しました。私が実行している元のコマンドは複雑すぎてここで説明できないため、問題を示す例を作成しました (これらのコマンドはすべて基本的に何もしていないことがわかっています)。また、データが実際に入力から出力にコピーされているかどうかを示すために pv を使用しています。
cat /dev/zero | pv > /dev/null
これは期待どおりに機能します。(/dev/zero から /dev/null にデータをコピーします)
cat /dev/zero | tee /dev/null | pv > /dev/null
これも期待どおりに機能します (データを複製し、両方のコピーを /dev/null に送信します)。
cat /dev/zero | tee >(pv -c > /dev/null) | pv -c > /dev/null
このコマンドは部分的にしか機能しません。STDIN から STDOUT へのコピーは引き続き機能しますが (1 つの pv に短時間進行状況が表示されます)、コマンド全体が無名パイプによって停止されます。匿名パイプは何も受信せず、出力の 1 つに書き込むことができないため、t が停止します。 (/dev/null の代わりにファイルに書き込むようにして、これを確認しました)。
なぜこれが bash で機能しないのか (予想どおり?) を知っている人がいれば、喜んで助けてくれます。
PS: bash の代わりに zsh を使用すると、コマンドは期待どおりに実行されます。残念ながら、これを実行する必要があるシステムには zsh がなく、そのシステムに zsh を展開する方法がありません。