Ich habe mich gefragt, wie man Folgendes versteht:
Die stdout eines Befehls in die stdin eines anderen Befehls zu leiten, ist eine leistungsstarke
Technik. Was aber, wenn Sie die Standardausgabe mehrerer
Befehle weiterleiten müssen? Hier kommt die Prozesssubstitution ins Spiel.
Mit anderen Worten, kann die Prozesssubstitution das tun, was die Pipe kann?
Was kann die Prozesssubstitution, aber die Pipe nicht?
Akzeptierte Antwort:
Eine gute Möglichkeit, den Unterschied zwischen ihnen zu verstehen, besteht darin, ein wenig auf der Befehlszeile zu experimentieren. Trotz der visuellen Ähnlichkeit in der Verwendung des <
Zeichen, es macht etwas ganz anderes als eine Umleitung oder Pipe.
Verwenden wir das date
Befehl zum Testen.
$ date | cat
Thu Jul 21 12:39:18 EEST 2011
Dies ist ein sinnloses Beispiel, aber es zeigt, dass cat
akzeptiert die Ausgabe von date
auf STDIN und spucke es wieder aus. Die gleichen Ergebnisse können durch Prozesssubstitution erzielt werden:
$ cat <(date)
Thu Jul 21 12:40:53 EEST 2011
Doch was gerade hinter den Kulissen geschah, war anders. Anstatt einen STDIN-Stream zu erhalten, cat
wurde tatsächlich der Name einer Datei übergeben, die geöffnet und gelesen werden musste. Sie können diesen Schritt mit echo
sehen statt cat
.
$ echo <(date)
/proc/self/fd/11
Als cat den Dateinamen erhielt, las es den Inhalt der Datei für uns vor. Auf der anderen Seite zeigte uns Echo nur den Namen der Datei, die übergeben wurde. Dieser Unterschied wird deutlicher, wenn Sie weitere Ersetzungen hinzufügen:
$ cat <(date) <(date) <(date)
Thu Jul 21 12:44:45 EEST 2011
Thu Jul 21 12:44:45 EEST 2011
Thu Jul 21 12:44:45 EEST 2011
$ echo <(date) <(date) <(date)
/proc/self/fd/11 /proc/self/fd/12 /proc/self/fd/13
Es ist möglich, Prozesssubstitution (die eine Datei generiert) und Eingabeumleitung (die eine Datei mit STDIN verbindet) zu kombinieren:
$ cat < <(date)
Thu Jul 21 12:46:22 EEST 2011
Es sieht ziemlich gleich aus, aber diesmal wurde cat STDIN-Stream anstelle eines Dateinamens übergeben. Sie können dies sehen, indem Sie es mit echo:
versuchen$ echo < <(date)
<blank>
Da echo STDIN nicht liest und kein Argument übergeben wurde, erhalten wir nichts.
Pipes und Eingabeumleitungen schieben Inhalte in den STDIN-Stream. Die Prozesssubstitution führt die Befehle aus, speichert ihre Ausgabe in einer speziellen temporären Datei und übergibt dann diesen Dateinamen anstelle des Befehls. Welchen Befehl Sie auch verwenden, er wird als Dateiname behandelt. Beachten Sie, dass die erstellte Datei keine normale Datei ist, sondern eine benannte Pipe, die automatisch entfernt wird, sobald sie nicht mehr benötigt wird.
Verwandt:Werden gefilterte Ereignisse in Process Monitor im Arbeitsspeicher oder auf der Festplatte gespeichert?