Die folgende Syntax verwirrt mich ein wenig. Obwohl es funktioniert, versteht es nicht, warum es funktioniert. Es scheint, als wären dem Befehl diff zwei Pipes zugeordnet. Aber gibt es nicht nur einen STDIN
?
Beispiele:
diff <(echo "foobar") <(echo "barbaz")
diff <(cat foo.txt) <(cat bar.txt)
bash
Manpage.Antworten:
Die Pipes sind einfach an andere Dateideskriptoren als 0 (stdin) gebunden:
Ein Prozess kann natürlich mehr als einen offenen Dateideskriptor gleichzeitig haben, daher gibt es kein Problem.
quelle
pipe()
Systemaufruf erstellt wurden.pipe()
und teilt die Unterprozesse auf. Der Hauptprozess hat zusätzliche Dateideskriptoren geöffnet hat , wenn ein anonymes Rohr verwendet wird. Diese zusätzlichen Dateideskriptoren werden im Formular übergeben/dev/fd/...
, und der Prozess öffnet sie normalerweise einfach unter Verwendung dieser Dateinamen. Dies führt dazu, dass siedup()
bearbeitet werden und noch offenere Dateideskriptoren erstellt werden. Der Prozess könnte auch den benannten Dateideskriptor sofort ohne offene Aufrufe verwenden ...a
ich es als aufgerufen./a <(ls)
und die Liste der Dateien erfolgreich gedruckt, um zu beweisen, dass der benannte Dateidekriptor (in meinem Fall 63) bereits geöffnet war. Die Bash verwendet möglicherweise Named Pipes in einem temporären Verzeichnis auf anderen Architekturen als Linux. In diesem Fall sind beim Aufrufen des Hauptprozesses keine zusätzlichen Dateideskriptoren geöffnet.