A construção <(tac file)
faz com que o shell seja:
- Crie um canal com um nome
- Em sistemas como o Linux e o SysV que possuem
/dev/fd
, um canal regular é usado e/dev/fd/<the-file-descriptor-of-the-pipe>
é usado como o nome. - Em outros sistemas, um canal nomeado é usado, o que requer a criação de uma entrada de arquivo real no disco.
- Em sistemas como o Linux e o SysV que possuem
- Inicie o comando
tac file
e conecte-o a uma extremidade do canal. - Substitua toda a construção na linha de comando pelo nome do pipe.
Após a substituição, a linha de comando se torna:
grep whatever < /tmp/whatever-name-the-shell-used-for-the-named-pipe
E então grep
é executado, e lê sua entrada padrão (que é o canal), lê e procura seu primeiro argumento.
Assim, o resultado final é o mesmo que com ...
tac file | grep whatever
... em que os mesmos dois programas são lançados e um pipe ainda é usado para conectá-los. Mas a construção <( ... )
é mais complicada porque envolve mais etapas e pode envolver um arquivo temporário (o pipe nomeado).
A construção <( ... )
é uma extensão e não está disponível no shell padrão POSIX bourne nem em plataformas que não suportam /dev/fd
ou pipes nomeados. Só por esse motivo, porque as duas alternativas consideradas são exatamente equivalentes em termos de funcionalidade, a forma mais flexível de command | other-command
é a melhor escolha.
A construção <( ... )
deve ser mais lenta devido à convolução adicional, mas é apenas na fase de inicialização e não espero que a diferença seja facilmente mensurável.
NOTA : Em plataformas Linux SysV, < ( ... )
não usa pipes nomeados, mas usa pipes normais. Canais regulares (na verdade, todos os descritores de arquivo) podem ser referenciados pelo especial chamado /dev/fd/<file-descriptor-number
, de modo que o shell usa como um nome para o pipe. Desta forma, evita criar um pipe nomeado real com um nome de arquivo temporário genuíno no sistema de arquivos real. Embora o truque /dev/fd
seja o usado para implementar esse recurso quando aparece originalmente em ksh
, é uma otimização: em plataformas que não suportam isso, um canal nomeado regular no sistema de arquivos real é usado conforme descrito acima .
TAMBÉM NOTE : Para descrever a sintaxe, pois <<( ... )
é enganoso. Na verdade, é <( ... )
, que é substituído pelo nome de um canal, e então o outro caractere <
que prefixa a coisa toda é separado dessa sintaxe e é a sintaxe regular bem conhecida para redirecionar a entrada de um arquivo.