Você pode usar a substituição de processo se estiver em um shell compatível (por exemplo, bash, ksh ou zsh):
while read sid p_name p_age ; do ...; done < <(get_names)
Isso é necessário no bash se você quiser que o link final do seu pipeline seja o shell em execução (para que ele possa ter um efeito no shell em execução):
for sh in bash ksh zsh; do
echo $sh:; $sh -c 'while read var; do i=$var
done < <(printf "%s\n" 1 2); echo $i '
done
Saída:
bash:
2
ksh:
2
zsh:
2
Considerando que com um pipeline regular:
for sh in bash ksh zsh; do
echo $sh:; $sh -c 'printf "%s\n" 1 2 |
while read var; do i=$var; done ; echo $i ';
done
a atribuição não é suficiente porque o bash executa o loop while em um subshell, em vez do shell atual:
bash:
ksh:
2
zsh:
2