Die Konstruktion <(tac file)
bewirkt, dass:
- Erstellen Sie eine Pipe mit einem Namen
- Auf Systemen wie Linux und SysV
/dev/fd
wird eine reguläre Pipe verwendet, /dev/fd/<the-file-descriptor-of-the-pipe>
die als Name verwendet wird.
- Auf anderen Systemen wird eine Named Pipe verwendet, für die ein tatsächlicher Dateieintrag auf der Festplatte erstellt werden muss.
- Starten Sie den Befehl
tac file
und verbinden Sie ihn mit einem Ende der Pipe.
- Ersetzen Sie die gesamte Konstruktion in der Befehlszeile durch den Namen der Pipe.
Nach dem Ersetzen wird die Befehlszeile wie folgt:
grep whatever < /tmp/whatever-name-the-shell-used-for-the-named-pipe
Und dann grep
wird es ausgeführt, und es liest seine Standardeingabe (die die Pipe ist), liest es und sucht darin nach seinem ersten Argument.
Das Endergebnis ist also das gleiche wie bei ...
tac file | grep whatever
... dass dieselben zwei Programme gestartet werden und immer noch eine Pipe verwendet wird, um sie zu verbinden. Die <( ... )
Konstruktion ist jedoch komplizierter, da sie mehr Schritte umfasst und möglicherweise eine temporäre Datei (die Named Pipe) enthält.
Das <( ... )
Konstrukt ist eine Erweiterung und weder in der Standard-POSIX-Bourne-Shell noch auf Plattformen verfügbar, die keine /dev/fd
Pipes unterstützen oder benennen. Allein aus diesem Grund ist die tragbarere command | other-command
Form die bessere Wahl , da die beiden in Betracht gezogenen Alternativen in ihrer Funktionalität genau gleichwertig sind .
Die <( ... )
Konstruktion sollte wegen der zusätzlichen Faltung langsamer sein, aber es ist nur in der Startphase und ich erwarte nicht, dass der Unterschied leicht messbar ist.
ANMERKUNG : Verwendet auf Linux SysV-Plattformen < ( ... )
keine Named Pipes, sondern reguläre Pipes. Auf reguläre Pipes (in der Tat alle Dateideskriptoren) kann mit dem speziellen Namen verwiesen werden, /dev/fd/<file-descriptor-number
sodass die Shell diesen Namen für die Pipe verwendet. Auf diese Weise wird vermieden, dass eine echte Named Pipe mit einem echten temporären Dateinamen im realen Dateisystem erstellt wird. Obwohl der /dev/fd
Trick verwendet wurde, um diese Funktion zu implementieren, als sie ursprünglich angezeigt wurde ksh
, handelt es sich um eine Optimierung: Auf Plattformen, die dies nicht unterstützen, wird wie oben beschrieben eine reguläre Named Pipe im realen Dateisystem verwendet.
AUCH HINWEIS : Um die Syntax als <<( ... )
irreführend zu beschreiben . Tatsächlich ist es das <( ... )
, was durch den Namen einer Pipe ersetzt wird, und dann ist das andere <
Zeichen, das dem Ganzen vorangestellt ist, von dieser Syntax getrennt und es ist die reguläre bekannte Syntax zum Umleiten von Eingaben aus einer Datei.
< <(...)
für0< <(...)
nicht steht<<(...)
.