Это называется процессом замещения.
Синтаксис <(list)
поддерживается как bash
и zsh
. Он позволяет передавать выходные данные команды (list
) другой команде, когда использование канала (|
) невозможно. Например, когда команда просто не поддерживает ввод из STDIN
или вам нужен вывод нескольких команд:
diff <(ls dirA) <(ls dirB)
<(list)
связывает вывод list
с файлом в /dev/fd
, если он поддерживается системой, в противном случае используется именованный канал (FIFO) (что также зависит от поддержки системой; ни одно из руководств не говорит, что произойдет, если оба механизмы не поддерживаются, вероятно, он прерывается с ошибкой). Имя файла затем передается в качестве аргумента в командной строке.
zsh
дополнительно поддерживает =(list)
как возможную замену для <(list)
. С =(list)
временный файл используется вместо файла в /dev/fd
или FIFO. Его можно использовать в качестве замены для <(list)
если программе нужно искать в выводе.
Согласно руководству по ZSH, могут быть и другие проблемы с тем, как работает <(list)
:
Форма =
полезна, поскольку и /dev/fd
и реализация именованного канала <(...)
имеют недостатки. В первом случае некоторые программы могут автоматически закрывать дескриптор файла до проверки файла в командной строке, особенно если это необходимо по соображениям безопасности, например, когда программа запускает setuid. Во втором случае, если программа фактически не открывает файл, подоболочка, пытающаяся читать или записывать в канал, будет (в типичной реализации, в разных операционных системах может иметь разное поведение) блокироваться навсегда и должна быть явно уничтожена. , В обоих случаях оболочка фактически передает информацию с использованием канала, поэтому программы, которые ожидают lseek (см. Man-страницу lseek(2)
), не будут работать.