$(sleep 5) &
echo $!
sleep 1
echo "done"
As saídas acima:
$ ./test.sh
7483
done
No entanto, se eu procurar sleep
em ps aux
, vejo:
ps aux | rg sleep
chris 7484 0.0 0.0 132788 1432 pts/6 S+ 12:10 0:00 sleep 1
chris 7485 0.0 0.0 132788 1432 pts/6 S+ 12:10 0:00 sleep 5
chris 7519 0.0 0.0 10376 5744 pts/7 S+ 12:10 0:00 rg --no-ignore-vcs sleep
O processo do sono 5 é 7485
e não 7483
como saída do script. Qual é a causa desse comportamento?
executa um shell que é executado
sleep
. O pid dado por$!
é o do shell.Você não precisa da substituição aqui,
daria
sleep
o pid de você.Imagino que
sleep
no seu exemplo substitua outra coisa, mas em qualquer caso, uma substituição em segundo plano provavelmente é desnecessária. Usando apenas um subshell,normalmente fornecerá
sleep
o pid de você, porque muitos shells se substituem pelo comando filho quando executam o último comando em um subshell, o que efetivamente reutiliza o pid do subshell parasleep
; maslhe dará o pid do shell, não
sleep
o 's.