Dies wird als Prozesssubstitution bezeichnet.
Die <(list)
Syntax wird von bash
und unterstützt zsh
. Es bietet eine Möglichkeit, die Ausgabe eines Befehls ( list
) an einen anderen Befehl zu übergeben, wenn die Verwendung einer Pipe ( |
) nicht möglich ist. Zum Beispiel, wenn ein Befehl nur keine Eingabe von unterstützt STDIN
oder Sie die Ausgabe mehrerer Befehle benötigen:
diff <(ls dirA) <(ls dirB)
<(list)
Verbindet die Ausgabe von list
mit einer Datei in /dev/fd
, wenn dies vom System unterstützt wird. Andernfalls wird eine Named Pipe (FIFO) verwendet (dies hängt auch von der Unterstützung durch das System ab. In keinem Handbuch wird angegeben, was passiert, wenn beide Mechanismen nicht unterstützt werden. Vermutlich wird dies abgebrochen ein Fehler). Der Name der Datei wird dann in der Befehlszeile als Argument übergeben.
zsh
unterstützt zusätzlich =(list)
als möglicher ersatz für <(list)
. Bei =(list)
einer temporären Datei wird anstelle von Datei /dev/fd
ein FIFO verwendet. Es kann als Ersatz für <(list)
den Fall verwendet werden, dass das Programm in der Ausgabe suchen muss.
Laut ZSH-Handbuch kann es auch andere Probleme mit der Funktionsweise geben <(list)
:
Das =
Formular ist nützlich, da sowohl /dev/fd
die Named-Pipe-Implementierung als auch <(...)
die Named- Pipe-Implementierung Nachteile aufweisen. Im ersteren Fall schließen einige Programme möglicherweise den betreffenden Dateideskriptor automatisch, bevor sie die Datei in der Befehlszeile untersuchen, insbesondere wenn dies aus Sicherheitsgründen erforderlich ist, z. B. wenn das Programm setuid ausführt. Wenn im zweiten Fall das Programm die Datei nicht öffnet, wird die Subshell, die versucht, aus der Pipe zu lesen oder in die Pipe zu schreiben, für immer blockiert (in einer typischen Implementierung haben unterschiedliche Betriebssysteme möglicherweise ein unterschiedliches Verhalten) und muss explizit beendet werden . In beiden Fällen stellt die Shell die Informationen tatsächlich über eine Pipe bereit, sodass Programme, die erwarten, in lseek(2)
der Datei nach Informationen zu suchen (siehe Manpage ), nicht funktionieren.
pfctl -f <(echo "pf rules")
einen schlechten Dateideskriptor sagte. Die Verwendung von zsh und = (echo "pf rules") funktioniert stattdessen.