GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Prozesssubstitution und Pipe?

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?
Linux
  1. `^m` und wie wird man es los?

  2. Warum funktioniert die Bash-Prozesssubstitution bei einigen Befehlen nicht?

  3. Threads und Dateideskriptoren

  4. Unix - Kopf UND Ende der Datei

  5. Tod des übergeordneten Prozesses erkennen

So erhalten Sie das aktuelle Datum und die aktuelle Uhrzeit in Python

Ansible Inventar- und Konfigurationsdateien

So stellen Sie Datum und Uhrzeit unter Linux ein

Erstellen einer temporären Datei vs. Prozesssubstitution vs. Variablenerweiterung?

Ändern der Attribute „Erstellungsdatum“ und „Zuletzt geändert“ einer Datei in die einer anderen Datei

Den Speicher eines Linux-Prozesses in eine Datei ausgeben