Das funktioniert nicht:
$ head file | tee >(sort >&3) | paste <(cat <&3) -
bash: 3: Bad file descriptor
aber ich hoffe, es ist offensichtlich, was damit erreicht werden soll, nämlich das Äquivalent von:
$ head file | sort >temp1
$ head file >temp2
$ paste temp1 temp2
Wie kann man dieses parallele Rohr richtig erstellen und verwenden?
(Nehmen Sie an, dass „head“ eine kostspielige Operation darstellt und dass ich mir der Gefahren eines Deadlocks bewusst bin.)
Antwort1
Ich habe festgestellt, dass das explizite Erstellen einer weiteren Pipe zunächst das bewirkt, was ich wollte:
$ 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
Die Notwendigkeit von „sleep“ und die Verwendung von „$pipe3“ statt „&3“ macht es jedoch etwas weniger elegant.