Это называется процессом замещения.
<(list)
Синтаксис поддерживается обоими, bash
и zsh
. Он позволяет передавать выходные данные команды ( list
) другой команде, если использование pipe ( |
) невозможно. Например, когда команда просто не поддерживает ввод из 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)
) в файле, не будут работать.
pfctl -f <(echo "pf rules")
сказал плохой дескриптор файла. использование zsh и = (echo "pf rules") вместо этого работает.Обратите внимание, это ответ Bash, а не Zsh.
В bash есть случаи, когда вы не можете использовать трубы:
Поскольку каналы вводят подоболочки для каждого компонента конвейера, при выходе из подоболочек любые побочные эффекты, на которые вы полагались, исчезли бы. Например, этот надуманный пример:
будет отображать пустую строку, потому что
$count
переменная не существует в текущей оболочке.Подстановка процесса bash позволяет вам избежать этой загадки, позволяя вам читать из вывода "some_command", как если бы вы были из файла
(1) - нормальное перенаправление ввода. (2) является началом
<()
синтаксиса замены процесса.источник