Isso é chamado de substituição de processo.
A <(list)sintaxe é suportada por ambos, bashe 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 STDINou você precisa da saída de vários comandos:
diff <(ls dirA) <(ls dirB)
<(list)conecta a saída de listcom 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.
zshadicionalmente suporta =(list)como possível substituição para <(list). Com =(list)um arquivo temporário é usado em vez de arquivo /dev/fdou 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/fdimplementaçã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.