Dies wird Prozesssubstitution genannt.
3.5.6 Prozessersetzung
Die Prozesssubstitution ermöglicht es, auf die Eingabe oder Ausgabe eines Prozesses mit einem Dateinamen zu verweisen.
Die Prozessliste wird asynchron ausgeführt, und ihre Ein- oder Ausgabe erscheint als Dateiname. Dieser Dateiname wird als Ergebnis der Erweiterung als Argument an den aktuellen Befehl übergeben. Wenn die Form>(Liste) verwendet wird, liefert das Schreiben in die Datei Eingaben für die Liste. Wenn die Form <(Liste) verwendet wird, sollte die als Argument übergebene Datei gelesen werden, um die Ausgabe der Liste zu erhalten. Beachten Sie, dass zwischen
Es ist nicht nur ein Bash-Ding, wie es ursprünglich in ksh auftauchte, sondern es ist nicht im Posix-Standard enthalten.
Unter der Haube hat die Prozesssubstitution zwei Implementierungen. Auf Systemen, die /dev/fd
unterstützen (die meisten Unix-ähnlichen Systeme) funktioniert es durch den Aufruf von pipe(
)-Systemaufruf, der einen Dateideskriptor $fd
zurückgibt für eine neue anonyme Pipe und dann die Zeichenfolge /dev/fd/$fd
erstellen , und ersetzt das in der Befehlszeile. Auf Systemen ohne /dev/fd
Unterstützung, es ruft mkfifo
auf mit einem neuen temporären Dateinamen, um eine benannte Pipe zu erstellen, und ersetzt diesen Dateinamen auf der Befehlszeile.
Sie können an <( somecommand )
denken als Dateiname einer temporären Datei, die die Ausgabe von somecommand
enthält . Mit anderen Worten,
utility < <( somecommand )
ist eine Abkürzung für
somecommand >tempfile
utility <tempfile
rm -f tempfile
Und
utility <( somecommand )
ist eine Abkürzung für
somecommand >tempfile
utility tempfile # notice the lack of redirection here (utility expected to read from "tempfile")
rm -f tempfile
Ebenso >( somecommand )
kann als Dateiname einer temporären Datei angesehen werden, die in somecommand
eingespeist wird auf seiner Standardeingabe. Mit anderen Worten,
utility > >( somecommand )
ist eine Abkürzung für
utility >tempfile
somecommand <tempfile
rm -f tempfile
Und
utility >( somecommand )
könnte möglicherweise eine Abkürzung für
seinmkfifo temppipe
somecommand <temppipe &
utility temppipe # utility is expected to write to "temppipe"
rm -f temppipe
(oder so ähnlich)