O subshell iniciado por $(foo)
tem que sair completamente (junto com qualquer processo em segundo plano), para que o shell principal saiba que não há mais entrada a ser capturada pela substituição do comando. Afinal, bar
poderia produzir algo após o sono.
Mas você pode redirecionar a saída de bar
para /dev/null
:
foo () {
bar > /dev/null &
echo "$!"
}
Ou (no Bash ou no ksh) nix a substituição do comando e execute bar
no shell principal:
foo() {
typeset -n _pid=$1
bar &
_pid=$!
}
foo FOO
echo "$FOO"
(Ou o equivalente com eval
no padrão sh
.)