Запутался, проблема с wait в Bash скрипте
Этот скрипт работает нормально:
#!/bin/bash
sleep 9 &
wait
echo "ok"
Выводит "ОК" через ~ 9 секунд
А вот этот:
#!/bin/bash
echo "1" | while read in
do
sleep 9 &
done
wait
echo "ok"
выводит "ОК" сразу, вопрос чего я не понимаю, почему не ждем фоновый процесс?
Ответы (1 шт):
Автор решения: Fat-Zer
→ Ссылка
Дело в том, что элементы конвейера bash, как и большинство других оболочек, запускает в дочерней подоболочке (subshell). т.е. второй пример будет аналогичен следующему:
(sleep 9 &); wait
Само собой, wait из родительского процесса не видит детей запущенных в дочернем процессе и поэтому сразу завершается.
В данном случае можно перенести ожидание в подоболочку:
echo 9 | { while read n; do
sleep $n
done
wait
}
Или использовать перенаправление вывода процесса (process substitution):
while read n; do
sleep $n
done < <(echo 9) # осторожно, bash'изм
wait
Другие классические способы обхода описаны в BashFAQ/024