.png)
여러 개의 백그라운드 작업이 실행 중인데 이제 두 개의 백그라운드 작업을 더 실행하고 마지막 두 개만 기다리려고 한다고 가정해 보겠습니다. 예를 들어:
# 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
추신: 이 질문은이 간단한 질문.
답변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;