Isso é chamado de substituição de processo.
A <(list)
sintaxe é suportada por ambos, bash
e zsh
. Ele fornece uma maneira de passar a saída de um comando ( list
) para outro comando quando o uso de um pipe ( |
) não é possível. Por exemplo, quando um comando simplesmente não suporta entrada de STDIN
ou você precisa da saída de vários comandos:
diff <(ls dirA) <(ls dirB)
<(list)
conecta a saída de list
com um arquivo em /dev/fd
, se suportado pelo sistema, caso contrário, um pipe nomeado (FIFO) é usado (que também depende do suporte do sistema; nenhum manual diz o que acontece se ambos os mecanismos não forem suportados, presumivelmente ele aborta com um erro). O nome do arquivo é passado como argumento na linha de comando.
zsh
adicionalmente suporta =(list)
como possível substituição para <(list)
. Com =(list)
um arquivo temporário é usado em vez de arquivo /dev/fd
ou um FIFO. Pode ser usado como um substituto para <(list)
se o programa precisar espreitar na saída.
De acordo com o manual da ZSH , também pode haver outros problemas de como <(list)
funciona:
O =
formulário é útil, pois a /dev/fd
implementação de pipe nomeado e o de <(...)
têm desvantagens. No primeiro caso, alguns programas podem fechar automaticamente o descritor de arquivo em questão antes de examinar o arquivo na linha de comando, principalmente se isso for necessário por razões de segurança, como quando o programa está executando o setuid. No segundo caso, se o programa realmente não abrir o arquivo, o subshell que tenta ler ou gravar no canal irá (em uma implementação típica, sistemas operacionais diferentes podem ter um comportamento diferente) bloquear para sempre e precisar ser morto explicitamente . Nos dois casos, o shell realmente fornece as informações usando um pipe, para que os programas que esperam seguir (veja a página de manual lseek(2)
) no arquivo não funcionem.
pfctl -f <(echo "pf rules")
diria um descritor de arquivo incorreto. usando zsh e = (echo "pf rules") funciona.