Dengan bash
, Anda akan memiliki jaminan itu kecuali Anda telah memulai pekerjaan latar belakang lain (dan berhati-hatilah bahwa pekerjaan latar belakang dapat dimulai dengan &
tetapi juga dengan coproc
dan dengan proses substitusi) antara foo &
dan wait
.
POSIX mensyaratkan shell mengingat status keluar dari setidaknya 25 pekerjaan setelah mereka pergi , tetapi bash
mengingat lebih dari itu.
Sekarang, jika Anda melakukannya:
foo & pid=$!
...
bar &
wait "$pid"
Anda tidak mendapat jaminan yang bar
tidak akan diberi pid yang sama dengan foo
(jika foo
telah dihentikan pada saat bar
dimulai), jadi meskipun tidak mungkin, wait "$pid"
dapat memberi Anda status keluar dari bar
.
Anda dapat mereproduksinya dengan:
bash -c '(exit 12; foo) & pid=$!
while : bar & [ "$pid" != "$!" ]; do :;done
wait "$pid"; echo "$?"'
yang akan (pada akhirnya) memberi Anda 0
alih-alih 12
.
Untuk menghindari masalah, salah satu caranya adalah menuliskannya sebagai:
{
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
tidak berfungsi. Proses dikumpulkan dan status keluar dibuang tepat sebelum prompt ditampilkan (secara default).