Я пытаюсь зациклить, пока не завершится фоновый процесс (запущенный ранее в скрипте). Легко воспроизводимый контрольный пример:
ping -c 10 localhost &>/dev/null &
В командной строке я могу выполнить цикл while [[ -n $(jobs) ]]
(в то время как $(jobs)
не равно нулю).
$ ping -c 10 localhost &>/dev/null &
[1] 19078
$ while [[ -n $(jobs) ]]; do echo -n .; sleep 1; done
.........[1]+ Done ping -c 5 localhost &> /dev/null
Однако те же две строки в сценарии будут продолжать печататься .
пока я не нажму Ctrl-C
.
Странно, если я вызываю jobs
внутри цикла, скрипт завершается, как и ожидалось.
$ ./background-ping.sh
.[1]+ Running ping -c 5 localhost &> /dev/null &
.[1]+ Running ping -c 5 localhost &> /dev/null &
.[1]+ Running ping -c 5 localhost &> /dev/null &
.[1]+ Running ping -c 5 localhost &> /dev/null &
.[1]+ Done ping -c 5 localhost &> /dev/null
Я знаю, что есть другие способы проверить, завершено ли фоновое задание (например, проверка /proc
), но я хочу знать, почему проверка jobs
не работает должным образом.