Dies ist keine mehrfache Standardeingabe. Dies ist ein Bashismus, der 'Process Substitution'http://tldp.org/LDP/abs/html/process-sub.html
genannt wird
Es erstellt eine Pseudodatei (/dev/fd/something
) für jede Substitution. Es ist ziemlich nützlich. Der Befehl kann nur als Stream lesen, dh er kann nicht mit fseek hin und her gehen. Es muss es als Strom von Bytes lesen, wie eine Pipe.
BONUS-Antwort
Sie müssen nicht zu viel tun, um dies zu verwenden. Was Ihr Skript betrifft, erhält es einen gültigen Dateinamen auf der Befehlszeile, der wie alles andere geöffnet werden kann. Wie andere gesagt haben, würden Sie diff /dev/fd/XX /dev/fd/YY
sehen . Wenn Sie eine stat() für eine dieser Pseudodateien ausführen, werden Sie sehen, dass es sich um eine benannte Pipe handelt, und Sie sollten sie mit Pipe-Semantik behandeln - nämlich ohne fseek() oder ftell(). Wenn Sie einen stat()-Test durchführen, um explizit zu sehen, ob es sich um eine Datei handelt (z. B. [ -f $1 ]
) dies wird break - dies ist immerhin als benannte Pipe implementiert.
<(...)
verarbeitet die Ersetzung in bash. Die Ausgabe des Prozesses in den Klammern wird an einen zusätzlichen Dateideskriptor über die normalen 3 hinaus gesendet, und ein Dateiname wird zurückgegeben, der diesem Dateideskriptor entspricht. Auf diese Weise kann die Ausgabe eines Befehls als Dateiname behandelt werden, der an einen anderen Befehl übergeben wird.
Es gibt eine stdin
und ein stdout
für jeden Prozess . Sie sind normalerweise mit dem Terminal verbunden, können aber getrennt voneinander umgeleitet werden.
Im Beispiel gibt es zwei wget
beteiligten Prozesse, von denen jeder seinen eigenen stdin
erhält und stdout
. Jeweils wget
Der Prozess schreibt in -
, das ist sein stdout
. Dann bash
's Prozesssubstitution <(...)
verbindet die stdout
des Prozesses in eine eindeutige Pseudodatei, aus der diff
kann lesen. Beachten Sie, dass die zwei Prozesssubstitutionen zwei verschiedene Pseudodateien ergeben! Also diff
sieht so etwas wie:
diff /dev/fd/XX /dev/fd/YY
wo der stdout
von wget -q -O - URL1
ist mit /dev/fd/XX
verbunden , und der stdout
von wget -q -O - URL2
bis /dev/fd/YY
.