Bash read comando e redirecionamento de stdin

7

Como eu entendo a documentação do bash | e < redirecionar stdin. Portanto, cmd | foo e foo < <(cmd) devem ser mais ou menos equivalentes. No entanto, para o comando bash-internal read, este não parece ser o caso. Por exemplo, se eu inserir

a=""; b=""; read a b < <(echo a b); echo $a $b

imprime a b , enquanto

a=""; b=""; echo a b | read a b; echo $a $b

imprime nada. Por outro lado, se eu entrar

a=""; b=""; cat < <(echo a b) >foo1

a=""; b=""; echo a b | cat > foo2

os arquivos foo1 e foo2 são exatamente os mesmos. Então, minha pergunta é: qual é a diferença com os dois formulários quando o comando de leitura está envolvido (ou em geral)? Eles devem ver exatamente a mesma entrada redirecionada. Enquanto o formulário < <(...) funciona, acho muito ilegível e prefiro muito mais usar o formulário de pipe.

    
por Elmar Zander 09.03.2012 / 15:46

1 resposta

8

O ato de pipeline executa read em uma subshell, enquanto a substituição de processo não. Para a maioria dos casos de uso, isso não é um problema, mas nesta instância você deseja afetar diretamente o shell (manipulando variáveis). Como read foi invocado em um subshell, somente a subshell é afetada. Como tal, qualquer ação que você deseje executar nelas precisará também ser executada na sub-camada; por exemplo:

echo a b | { read a b ; echo "$a" "$b" ; }
    
por 09.03.2012 / 16:05