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" ; }