Ein guter Weg, um den Unterschied zwischen ihnen herauszufinden, besteht darin, ein wenig in der Befehlszeile zu experimentieren. Trotz der visuellen Ähnlichkeit bei der Verwendung des <
Zeichens unterscheidet es sich erheblich von einer Umleitung oder Pipe.
Verwenden wir den date
Befehl zum Testen.
$ date | cat
Thu Jul 21 12:39:18 EEST 2011
Dies ist ein sinnloses Beispiel, aber es zeigt, dass cat
die Ausgabe von date
auf STDIN akzeptiert und wieder ausgespuckt wurde. Die gleichen Ergebnisse können durch Prozesssubstitution erzielt werden:
$ cat <(date)
Thu Jul 21 12:40:53 EEST 2011
Was jedoch 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 sehen, indem Sie echo
anstelle von verwenden cat
.
$ echo <(date)
/proc/self/fd/11
Als cat den Dateinamen erhielt, las sie den Inhalt der Datei für uns. Auf der anderen Seite zeigte uns Echo nur den Namen der Datei, dass sie übergeben wurde. Dieser Unterschied wird deutlicher, wenn Sie weitere Substitutionen 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, die Prozessersetzung (die eine Datei generiert) und die Eingabeumleitung (die eine Datei mit STDIN verbindet) zu kombinieren:
$ cat < <(date)
Thu Jul 21 12:46:22 EEST 2011
Es sieht ziemlich ähnlich aus, aber dieses Mal wurde cat der STDIN-Stream anstelle eines Dateinamens übergeben. Sie können dies sehen, indem Sie es mit echo versuchen:
$ echo < <(date)
<blank>
Da das Echo STDIN nicht liest und kein Argument übergeben wurde, erhalten wir nichts.
Pipes und Eingabeumleitungen leiten Inhalte in den STDIN-Stream. Die Prozessersetzung führt die Befehle aus, speichert ihre Ausgabe in einer speziellen temporären Datei und übergibt diesen Dateinamen anstelle des Befehls. Bei jedem Befehl, den Sie verwenden, wird er als Dateiname behandelt. Beachten Sie, dass die erstellte Datei keine reguläre Datei ist, sondern eine Named Pipe, die automatisch entfernt wird, sobald sie nicht mehr benötigt wird.