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