bash で並列パイプをリダイレクトするにはどうすればいいですか?

bash で並列パイプをリダイレクトするにはどうすればいいですか?

これは機能しません:

   $ head file | tee >(sort >&3) | paste <(cat <&3) -
   bash: 3: Bad file descriptor

しかし、これが何を意図しているかは明らかだと思います。それは次のものと同等です:

   $ head file | sort >temp1
   $ head file >temp2
   $ paste temp1 temp2

平行パイプを作成して使用する適切な方法は何ですか?

(「head」はコストのかかる操作を表し、デッドロックの危険性を認識していると仮定します。)

答え1

最初に別のパイプを明示的に作成すると、目的の動作が実現できることがわかりました。

$ pipe3="$$.pipe3"
$ mkfifo $pipe3
...
$ head file_1 | tee >(sort >$pipe3) | (sleep 1; paste <(cat <$pipe3) - )
...
$ tail file_2 | tee >(sort -r >$pipe3) | (sleep 1; paste <(cat <$pipe3) - )
...
$ rm $pipe3

ただし、「sleep」が必要であり、「&3」ではなく「$pipe3」を使用するため、少しエレガントさに欠けます。

関連情報