Wie heißt die Bash-Syntax '<(Dateiinhalt)'?

25

Diese Antwort auf Security StackExchange verwendet eine interessante Bash-Syntax, um eine Datei in-line zu generieren:

openssl req -new -x509 -nodes -newkey ec:<(openssl ecparam -name secp384r1) -keyout cert.key -out cert.crt -days 3650

Dieses Bit ist besonders interessant:

<(openssl ecparam -name secp384r1)

Laufen nur:

echo <(openssl ecparam -name secp384r1)

Ich komme zurück /dev/fd/63

Dies scheint also einen temporären Dateideskriptor mit dem Inhalt der Datei zu bilden.

Wie heißt das?

Mikemaccana
quelle
3
Beachten Sie, dass die resultierende "Datei" tatsächlich eine Named Pipe ist und von einigen Programmen nicht als Dateiargumente unterstützt wird. Beispiel: git diff --no-index file1 <(cat file2)fehl mit: error: /dev/fd/63: unsupported file type. Sie können auch sehen, error: readlink("/dev/fd/63"): No such file or directoryob die Implementierung einen Symlink zur Pipe erstellt (erscheint aus irgendeinem Grund als defekter Link für mich).
Kelvin

Antworten:

35

Es wird Prozessersetzung genannt und ist eine Funktion von bash, zsh und ksh (und möglicherweise anderen, die ich nicht kenne). Es ist kein POSIX, und Sie sollten es nicht in portablem Code verwenden, aber es ist sehr nützlich.

Hier ist der relevante Abschnitt des Bash-Handbuchs:

3.5.6 Prozessersetzung

Die Prozessersetzung wird auf Systemen unterstützt, die Named Pipes (FIFOs) oder die Methode / dev / fd zum Benennen offener Dateien unterstützen. Es hat die Form von

  <(list) 

oder

  >(list) 

Die Prozessliste wird ausgeführt, wobei die Eingabe oder Ausgabe mit einem FIFO oder einer Datei in / dev / fd verbunden ist. Der Name dieser Datei wird als Ergebnis der Erweiterung als Argument an den aktuellen Befehl übergeben. Wenn das Formular> (Liste) verwendet wird, wird beim Schreiben in die Datei eine Eingabe für die Liste bereitgestellt. Wenn das <(Listen) -Formular verwendet wird, sollte die als Argument übergebene Datei gelesen werden, um die Ausgabe der Liste zu erhalten. Beachten Sie, dass zwischen dem <oder> und der linken Klammer kein Leerzeichen stehen darf. Andernfalls würde das Konstrukt als Umleitung interpretiert.

Wenn verfügbar, wird die Prozessersetzung gleichzeitig mit der Parameter- und Variablenerweiterung, der Befehlssubstitution und der arithmetischen Erweiterung durchgeführt.

terdon
quelle