A substituição de processos é um recurso originado no shell Korn nos anos 80 (em ksh86). Na época, só estava disponível em sistemas que tinham suporte para arquivos /dev/fd/<n>
.
Mais tarde, o recurso foi adicionado a zsh
(desde o início: 1990) e bash
(em 1993). zsh
estava usando pipes nomeados temporários para implementá-lo, enquanto bash
estava usando /dev/fd/<n>
quando disponível e pipes nomeados de outra forma. zsh
passou a usar /dev/fd/<n>
quando disponível em 2.6-beta17
em 1996.
O suporte para a substituição de processos por meio de pipes nomeados em sistemas sem /dev/fd
foi adicionado somente a ksh
in ksh93u+
em 2012. O clone de domínio público de ksh
não é compatível.
Até onde sei, nenhum outro shell parecido com o Bourne o suporta ( rc
, es
, fish
, shells não semelhantes a Bourne suportam, mas com uma sintaxe diferente). yash
tem uma <(...)
de construção, mas isso é para redirecionamento de processo .
Embora bastante útil, o recurso nunca foi padronizado pelo POSIX. Então, não se pode esperar encontrá-lo em sh
, então não deve usá-lo em um script sh
.
Embora o comportamento de <(...)
não seja especificado em POSIX, (portanto não haveria nenhum problema em retê-lo), bash
desativa o recurso quando chamado como sh
ou quando chamado com POSIXLY_CORRECT=1
em seu ambiente.
Portanto, se você tiver um script que use <(...)
, deverá usar um shell que suporte o recurso para interpretá-lo como zsh
, bash
ou AT & T ksh
(claro, você precisa certifique-se de que o resto da sintaxe do script também seja compatível com esse shell).
Em qualquer caso:
cat <(cmd)
Pode ser escrito:
cmd | cat
Ou apenas
cmd
Para um comando diferente de cat
(que precisa receber dados por meio de um arquivo fornecido como argumento), em sistemas com /dev/fd/x
, você sempre pode fazer:
something | that-cmd /dev/stdin
Ou se você precisar que o stdin de that-cmd
seja preservado:
{ something 3<&- | that-cmd /dev/fd/4 4<&0 <&3 3<&-; } 3<&0