Isso é chamado de substituição de processo.
A sintaxe <(list)
é suportada por ambos, bash
e zsh
. Ele fornece uma maneira de passar a saída de um comando ( list
) para outro comando ao usar um canal ( |
) não é possível. Por exemplo, quando um comando simplesmente não suporta entrada de STDIN
ou você precisa da saída de múltiplos 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 (o que também depende do suporte do sistema; nenhum manual diz o que acontece se ambos os mecanismos não são suportados, presumivelmente, ele aborta com um erro). O nome do arquivo é então passado como argumento na linha de comando.
zsh
adicionalmente suporta =(list)
como possível substituto para <(list)
. Com =(list)
, um arquivo temporário é usado no lugar do arquivo em /dev/fd
ou FIFO. Ele pode ser usado como um substituto para <(list)
se o programa precisar procurar na saída.
De acordo com o manual do ZSH , pode haver outros problemas em como <(list)
funciona:
The
=
form is useful as both the/dev/fd
and the named pipe implementation of<(...)
have drawbacks. In the former case, some programmes may automatically close the file descriptor in question before examining the file on the command line, particularly if this is necessary for security reasons such as when the programme is running setuid. In the second case, if the programme does not actually open the file, the subshell attempting to read from or write to the pipe will (in a typical implementation, different operating systems may have different behaviour) block for ever and have to be killed explicitly. In both cases, the shell actually supplies the information using a pipe, so that programmes that expect to lseek (see man pagelseek(2)
) on the file will not work.