Com bash
, você terá essa garantia a menos que tenha iniciado outra tarefa em segundo plano (e esteja ciente de que as tarefas em segundo plano podem ser iniciadas com &
, mas também com coproc
e com substituição de processo) entre foo &
e wait
.
O POSIX exige que um shell se lembre do status de saída de pelo menos 25 jobs depois que eles saírem , mas bash
lembra muito mais que isso.
Agora, se você fizer isso:
foo & pid=$!
...
bar &
wait "$pid"
Você não tem garantia de que bar
não receberá o mesmo pid de foo
(se foo
tiver terminado no momento em que bar
iniciar), portanto, mesmo que seja improvável, wait "$pid"
pode dar-lhe o status de saída de bar
.
Você pode reproduzi-lo com:
bash -c '(exit 12; foo) & pid=$!
while : bar & [ "$pid" != "$!" ]; do :;done
wait "$pid"; echo "$?"'
que (eventualmente) lhe dará 0
em vez de 12
.
Para evitar o problema, uma maneira seria escrevê-lo como:
{
foo_pid=$!
while ps -p "$foo_pid"
do
ping -c 1 localhost
done
bar &
...
read <&3 ret
if [ "$ret" = 0 ]; then
echo foo was sucessful.
fi
} 3< <(foo > logfile 2>&1; echo "$?")