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!