Фоновую команду дожидаются, когда нужен её результат: оболочка вернёт приглашение, когда команда закончит.
wait ждёт фоновое задание этой оболочки, wait $! — последнюю фоновую команду. Чем она закончилась, оболочка записывает в переменную $? — это код завершения: 0 — успех, другое число — ошибка или прерывание. После Ctrl+C, например, $? хранит 130.
Через пять секунд оболочка напечатает Done у задания, а echo $? — 0. $? хранит код последней выполненной команды, поэтому печатают его сразу.
В ps ты нашёл чужой процесс с PID 1500 и выполнил wait 1500. Что напечатает оболочка?
-
Код завершения
waitузнаёт у своих заданий. Про чужой процесс он сообщитis not a child of this shell, а$?будет 127. -
waitничего не завершает, он ждёт. Про процесс, который запустила не эта оболочка,waitсообщитis not a child of this shell. -
waitждёт задания этой оболочки. Про чужой процесс она напечатаетpid 1500 is not a child of this shell.
wait ждёт задания своей оболочки — процессы, которые она запустила. На чужой PID оболочка печатает is not a child of this shell.
Главное в шаге
-
wait $!возвращает приглашение, когда закончит последняя фоновая команда. -
Код завершения лежит в
$?до следующей команды: 0 — успех, другое число — ошибка или прерывание.