Wie leite ich parallele Pipes in Bash um?

Wie leite ich parallele Pipes in Bash um?

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.

verwandte Informationen