2016-11-19 11 views
1

Kann jemand bitte erklären, wie diese Prozesssubstitutionen arbeiten.Wie funktionieren diese Prozesssubstitutionen?

(echo "YES")> >(read str; echo "1:${str}:first";)> >(read sstr; echo "2:$sstr:two")> >(read ssstr; echo "3:$ssstr:three") 

Output

1: 2: 3: YES: drei: zwei: eine erste

Ich habe herausgefunden, dass die ‚ssstr'-Substitution erhielt 60 FD, sstr FD 61 und str FD 62. (rechts nach links)

Aber wie ist (Echo "YES") mit dem Eingang des FD60 verbunden, und der Ausgang des FD60 mit dem Eingang FD61 und so weiter und schließlich FD62 druckt auf Terminal?

Alle gegen die Richtung der beiden Umleitungen.

Wie sind sie verschachtelt und wie verbunden? macht mich verrückt. Ty.

Antwort

2

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

  1. > >(read str; echo "1:${str}:first";)
  2. > >(read sstr; echo "2:$sstr:two")
  3. > >(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

Verwandte Themen