Tubulações versus substituição de processo

5

Ao tentar o truque cat "$@" para ler a partir de arquivos padrão de entrada ou , descobriu-se que pipe e processo de substituição manipulam uma nova linha perdida diferente :

printf %s foo > test.txt

unset REPLY
while read
do
    :
done < <(cat test.txt)
echo "$REPLY" # Prints foo

unset REPLY
cat test.txt | while read
do
    :
done
echo "$REPLY" # Prints nothing!

Isso é por design? Este "recurso" está documentado em algum lugar?

D'oh! @fered teve a ideia certa - é apenas mais um exemplo de como os valores das variáveis são perdidos porque os comandos piped são executados em um subshell .

    
por l0b0 25.10.2011 / 15:23

1 resposta

11

Variáveis em um cano nunca saem do cano vivo :)
A substituição de processos redireciona os dados para um descritor de arquivos. Nos bastidores, esse processo não é o mesmo que um | pipe. O seguinte funciona, porque está tudo dentro do mesmo pipe.

unset REPLY
cat test.txt | { 
  while read ;do : ;done
  echo "$REPLY" 
} # Prints foo!
    
por 25.10.2011 / 16:58