Это называется процессом замещения.
Синтаксис <(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)), не будут работать.