З 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
не працює. Процес збирається, а стан виходу відкидається безпосередньо перед відображенням запиту (за замовчуванням).