Considere este cenário:
diff file.txt <( cat file.txt | grep -v '^\s*#'| sed '/^$/d' )
este é um exemplo de redirecionamento da direita para a esquerda, no qual você processa um arquivo e redireciona o resultado como entrada para diff
. Caso de uso semelhante foi propostoaqui, que também funciona bem.
No entanto, a tentativa de redirecionar o resultado do processamento do arquivo para um bloco de código de maneira semelhante falha:
while read I; do
…
done <( cat $FIL | <do_something_here> )
Syntax error: "(" unexpected
Ou, se você tentar isso:
done < <( cat $FIL | <do_something_here> )
Syntax error: redirection unexpected
Como você redireciona a saída de algum processo para o bloco de código como entrada?
Responder1
<(...)
substituição de processoé um recurso do shell Korn. Também está disponível em zsh e bash. rc
e derivados e fish
também têm suporte para substituição de processos, mas com uma sintaxe diferente, enquanto no shell yash <(...)
há sintaxe para um recurso diferente:redirecionamento de processo.
A redação dissoErro de sintaxe: redirecionamento inesperadoo erro sugere que seu shell é um derivado do shell Almquist, como dash
. AFAIK, nemsubstituição de processonemredirecionamento de processoforam adicionados a qualquer ash
derivado.
while ...; done <(cmd)
funcionaria em yash
, while ...; done < <(cmd)
funcionaria em AT&T ksh, zsh e bash, mas nenhuma delas é sh
sintaxe padrão e nem funcionaria em dash
.
Em dash
(ou em qualquer sh
implementação), você precisaria cmd | while ...; done
, embora observe que in dash
, que o loop while seria executado em um subshell.
Você poderia fazer:
while ...; done << EOF
$(cmd)
EOF
Embora tenha cuidado, ele armazena toda a saída cmd
(retirada de todos os caracteres NUL (pelo dash
menos) e de todos os caracteres de nova linha à direita) na memória (e adiciona de volta um caractere de nova linha extra).
Em todo o caso,usar um while read
loop geralmente é uma indicação de que você está adotando a abordagem errada, especialmente se for apenas para processamento de texto.