Zunächst einmal, nicht tatsächlich Code schreiben, wie dieses :)
Die Prozess Substitutionen sind die Konstrukte >(...)
. Die (...)>
ist kein spezifisches Konstrukt; Es ist nur eine Subshell gefolgt von einer Ausgabeumleitung.
Dieses Beispiel ist ein einzelner Befehl (echo "YES")
von drei Ausgangs Umleitungen gefolgt
> >(read str; echo "1:${str}:first";)
> >(read sstr; echo "2:$sstr:two")
> >(read ssstr; echo "3:$ssstr:three")
Die letzte ist die eine, die tatsächlich auf den ursprünglichen angewendet wird Befehl; etwas wie echo word >foo >bar >baz
würde alle drei Dateien erstellen, aber die Ausgabe von echo
würde nur in baz
geschrieben werden.
Ähnlich starten alle drei Prozesssubstitutionen einen neuen Prozess, aber der Ausgang YES
wird nur in den letzten geschrieben. So erhält read ssstr
seinen Eingang von echo YES
.
An diesem Punkt, ich denke, Sie sehen, was zu undefiniertem Verhalten ausmacht. Die drei Prozesssubstitutionen werden in der umgekehrten Reihenfolge ausgeführt, in der sie erstellt wurden, als ob das Betriebssystem jeden Prozess beim nächsten Erstellen an einen Stapel weiterleitet und dann durch Abheben vom Stapel plant, aber ich glaube nicht, dass diese Reihenfolge ist garantiert durch alles.
In jedem Fall wird jedoch die Standardeingabe jeder Prozesssubstitution auf die Standardausgabe des Befehls festgelegt, unabhängig davon, welche andere Prozesssubstitution gerade ausgeführt wurde. Mit anderen Worten, der Befehl endet am Ende ähnlich wie