З bash, у вас буде ця гарантія, якщо ви не розпочали інше фонове завдання (і будьте уважні, що фонові завдання можна починати з, &а також із coprocзаміною та заміщенням процесів) між foo &і wait.
POSIX вимагає, щоб оболонка запам'ятовувала статус виходу принаймні 25 завдань після їх закінчення , але bashпам'ятає набагато більше, ніж це.
Тепер, якщо ви робите:
foo & pid=$!
...
bar &
wait "$pid"
У вас немає гарантії, що barне буде надано такий самий pid, як foo(якщо fooтермін припинився до моменту barпочатку), тому, хоча це малоймовірно, це wait "$pid"може дати вам статус виходу bar.
Ви можете відтворити його за допомогою:
bash -c '(exit 12; foo) & pid=$!
while : bar & [ "$pid" != "$!" ]; do :;done
wait "$pid"; echo "$?"'
який (зрештою) дасть вам 0замість 12.
Щоб уникнути проблеми, одним із способів було б записати її як:
{
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 "$?")
waitне працює. Процес збирається, а стан виходу відкидається безпосередньо перед відображенням запиту (за замовчуванням).