`wait` для процессов, запущенных в цикле for, но не для других, запущенных ранее

`wait` для процессов, запущенных в цикле for, но не для других, запущенных ранее

Предположим, у меня есть несколько запущенных фоновых задач, но теперь я хочу запустить еще две фоновые задачи, но дождаться только последних двух. Например:

# long running commands
sleep 60 &
sleep 60 &

# now wait only for these two:
sleep 5 & sleep 5 & wait; echo waited only for the 5s sleeps.

Результатом выполнения команды выше является ожидание команды echo в течение 60 секунд.

я знаю что могупередайте pid или jobid для ожидания. Но поскольку я запускаю процессы в forцикле, я не могу легко получить PID.

Я попробовал это, но безуспешно:

{ sleep 3 & sleep 5 & } wait; echo did not wait :

sleep 10 & { sleep 3 ; sleep 3 ; }& wait %2; echo only wait 3s

PS: Этот вопрос является продолжениемэтот более простой вопрос.

решение1

Вы можете запустить подоболочку:

{ sleep 20 && echo second output ; }
( sleep 2 & wait && echo first output ) 

Команда waitв подоболочке будет действительна только там.

решение2

На основе указаний @Kusalananda в более простом вопросе я придумал этот пример. Может быть, не самый простой...

Весь код ниже находится в интерактивной оболочке. Я просто разбил его на части для ответа, потому что иначе его было бы трудно читать.

Обратите внимание, что в bashверсии 4.1 и более ранних версиях !в "", вызывает замену истории в интерактивной оболочке (это было исправлено в версии 4.2). Вот на что я попался. Если вы действительно хотите цитировать, $!вы можете использовать "$! ", а завершающий пробел предотвратит срабатывание замены истории.

unset to_wait; 

date; 
sleep 3 & 

for i in 1 2 3; do 
    sleep 1 &
    # Don't put the ! in "" or you'll get an `event`. 
    to_wait+=( $! ); 
done; 
wait "${to_wait[@]}"; 

date; 
echo waited 1s for inner processes; 

# wait for the rest of the processes (just for illustration)
wait; 

date; 
echo waited 3s for outer process;

Связанный контент