Это не работает:
$ 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» и использование «$pipe3» вместо «&3» делает его немного менее элегантным.