"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를 전달하세요.. 하지만 루프에서 프로세스를 시작하기 때문에 forPID를 쉽게 얻을 수 없습니다.

나는 이것을 시도했지만 운이 없었습니다.

{ 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의 지침을 바탕으로 이 예를 생각해냈습니다. 아마도 가장 쉽지는 않을 것입니다 ...

아래의 모든 코드는 대화형 셸에 있습니다. 다른 방법으로는 읽기가 어렵기 때문에 답을 얻기 위해 부분적으로 나누었습니다.

bash4.1 및 이전 버전에서는 !in 이 ""대화형 셸에서 기록 교체를 트리거한다는 점에 유의하세요 (이 문제는 버전 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;

관련 정보