redirecionar da direita para a esquerda no bloco de código

redirecionar da direita para a esquerda no bloco de código

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. rce derivados e fishtambé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 ashderivado.

while ...; done <(cmd)funcionaria em yash, while ...; done < <(cmd)funcionaria em AT&T ksh, zsh e bash, mas nenhuma delas é shsintaxe padrão e nem funcionaria em dash.

Em dash(ou em qualquer shimplementaçã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 dashmenos) 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 readloop geralmente é uma indicação de que você está adotando a abordagem errada, especialmente se for apenas para processamento de texto.

informação relacionada