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.
Isso me ajudou a descobrir por que o MacOS pfctl -f <(echo "pf rules")diria um descritor de arquivo incorreto. usando zsh e = (echo "pf rules") funciona.
johnnyB
9
Observe que esta é uma resposta básica, não zsh.
Há casos no bash em que você não pode usar pipes:
some_command | some_other_command
como os tubos introduzem subcascas para cada componente do encanamento, quando as subcascas saem, quaisquer efeitos colaterais dos quais você confiava desapareceriam. Por exemplo, este exemplo artificial:
= (cmdlist) no zsh tem quase o mesmo efeito que <(cmdlist) no bash, mas cria (e exclui quando pronto) um arquivo temporário com a saída de cmdlist para o redirecionamento. Isso é bom quando a busca é potencialmente feita no programa. <(cmdlist) também é conhecido pelo zsh.
pfctl -f <(echo "pf rules")
diria um descritor de arquivo incorreto. usando zsh e = (echo "pf rules") funciona.Observe que esta é uma resposta básica, não zsh.
Há casos no bash em que você não pode usar pipes:
como os tubos introduzem subcascas para cada componente do encanamento, quando as subcascas saem, quaisquer efeitos colaterais dos quais você confiava desapareceriam. Por exemplo, este exemplo artificial:
exibirá uma linha em branco, porque a
$count
variável não existe no shell atual.Uma substituição de processo bash permite evitar esse enigma, permitindo que você leia a saída "some_command" como faria em um arquivo
(1) é um redirecionamento de entrada normal. (2) é o início da
<()
sintaxe de substituição do processo.fonte