wait to wbudowane polecenie powłoki (bash, a nie osobny program w /bin), które zatrzymuje wykonanie skryptu do momentu, aż zakończą się wskazane procesy potomne — na przykład zadania uruchomione w tle przez &. Zwraca kod wyjścia procesu, na który czekało, więc jest podstawowym narzędziem do synchronizacji: „odpal kilka rzeczy równolegle, poczekaj aż się zrobią, a potem jedź dalej”. Bez niego skrypt poleciałby do końca, zanim procesy w tle zdążyłyby coś zrobić.
Składnia i najważniejsze opcje
Podstawowa składnia: wait [-n] [-p ZMIENNA] [PID | %numer_zadania ...]
wait(bez argumentów) — czeka na wszystkie aktywne procesy potomne i zwraca 0.wait PID— czeka na proces o danym identyfikatorze i zwraca jego kod wyjścia.wait %1— czeka na zadanie o numerze widocznym wjobs(tzw. jobspec).-n— czeka na zakończenie dowolnego jednego z podanych zadań (albo pierwszego z brzegu, jeśli nie podasz listy) i zwraca jego kod. Dostępne od bash 4.3.-p ZMIENNA— zapisuje PID lub jobspec ukończonego zadania do zmiennej; przydatne razem z-n, żeby wiedzieć, które zadanie właśnie padło. Dostępne od bash 5.1.
Przykłady użycia
sleep 5 & wait— uruchamiasleepw tle i czeka na jego koniec, zanim skrypt ruszy dalej../backup.sh & PID=$!; wait $PID; echo "kod: $?"— łapie PID zadania w tle przez$!, czeka na nie i wypisuje jego kod wyjścia.zad1 & zad2 & zad3 & wait— odpala trzy zadania równolegle i czeka aż wszystkie się skończą (klasyczny wzorzec „fan-out, potem join”).wait -n job_a job_b— reaguje, gdy tylko pierwsze z dwóch zadań się zakończy, bez czekania na resztę.wait -n -p ukonczone; echo "zakonczylo sie: $ukonczone"— czeka na dowolne zadanie i zapisuje jego PID do$ukonczone.
Częste błędy i pułapki
Najczęstsza pomyłka to podanie PID-u procesu, który nie jest dzieckiem bieżącej powłoki — wait obsługuje tylko własne procesy potomne, a dla obcego lub nieistniejącego PID-u zwróci kod 127 i od razu wróci. Chcesz poczekać na cudzy proces? To zadanie dla innych narzędzi, nie dla wait.
Druga pułapka: wait bez argumentów zawsze zwraca 0, nawet jeśli któreś zadanie w tle zakończyło się błędem — jeśli zależy Ci na kodach wyjścia poszczególnych zadań, czekaj na nie po kolei przez konkretny PID i sprawdzaj $?. Pamiętaj też, że -n i -p to nowsze dodatki bash — na starszych powłokach albo w czystym sh/POSIX ich nie znajdziesz, a dash zna tylko goły wait.
Powiązane komendy: jobs, bg, fg, kill, disown, oraz zmienna specjalna $! przechowująca PID ostatniego zadania w tle.