Exemplo:
4,3
bash-4.3$ (echo "$BASHPID"; exit 123)
5358
bash-4.3$ wait 5358; echo "$?"
123
4,4
bash-4.4$ (echo "$BASHPID"; exit 123)
12171
bash-4.4$ wait 12171
bash: wait: pid 12171 is not a child of this shell
Você não pode mais usar wait
para obter o status de saída dessa sub-sela que é executada em primeiro plano (de forma síncrona). foreground refere-se a jobs de shells interativos, mas o mesmo se aplica a comandos executados em shells não interativos.
Observe que isso também se aplica a tarefas em segundo plano que depois são colocadas em primeiro plano com fg
:
bash-4.4$ (sleep 10; exit 123) &
[1] 12857
bash-4.4$ fg
( sleep 10; exit 123 )
bash-4.4$ wait 12857
bash: wait: pid 12857 is not a child of this shell
Com bash-4.3
e antes, bash
se lembraria do status de saída de todos os comandos anteriores de plano de fundo e primeiro plano. Isso não seria útil para os comandos de primeiro plano, como normalmente você não sabe o seu pid no script e também em coisas como:
cmd1 &
...
cmd2
wait "$!"
O pid de cmd1
poderia muito bem ter sido reutilizado por cmd2
. Nesse caso, wait "$!"
obteria o status de saída de cmd2
em vez de cmd1
. Gravar o pid de apenas comandos assíncronos reduz ligeiramente o risco de wait
, dando-lhe o status de saída do comando errado (ao lado do problema de desempenho mencionado por @Christopher).