O processo bash que continua em execução é o pai de tee
, não o script original. Você pode ver isso adicionando rastreamentos que exibem os IDs do processo:
#!/bin/bash
echo original=$$
exec > >(echo substitution=$BASHPID; tee /tmp/mylog.log) 2>&1
bash -c 'echo sleeper=$$; sleep 12312' &
Isso faz com que um processo bash adicional apareça, o pai de sleep
. Para se livrar desses processos bash, use exec
em todo:
#!/bin/bash
echo original=$$
exec > >(echo substitution=$BASHPID; exec tee /tmp/mylog.log) 2>&1
bash -c 'echo sleeper=$$; exec sleep 12312' &
Eu testei essa resposta no bash 4.3. Versões futuras do bash podem se tornar mais inteligentes em relação às chamadas não finais (como o ksh).