bash 모드의 의미는 무엇입니까 [...] & wait $!
? 예를 들어:
curl -LsS $AZP_AGENT_PACKAGE_LATEST_URL | tar -xz & wait $!
나는 이것을 다음과 같이 이해합니다.
&
백그라운드 하위 셸에서 이전 파이프라인을 실행하도록 bash에 지시합니다 .wait $!
그런 다음 반환하기 전에 파이프라인이 완료될 때 까지 기다립니다 .
하지만 그렇다면 파이프라인 자체를 실행하는 것과 어떻게 다릅니까? 점은 무엇인가?
이 예제(및 기타 예제)가 포함된 스크립트는 다음에서 찾을 수 있습니다.
https://docs.microsoft.com/en-us/azure/devops/pipelines/agents/docker?view=azure-devops
답변1
비대화형 셸에서 명령을 비동기적으로 실행하면 두 가지 뚜렷한 A
부작용이 있습니다 A & wait "$!"
.
.SIGINT 및 SIGQUIT는 무시됩니다
A
. 실행 중에 +를 누르면 Ctrl종료되는 것을 볼 수 있지만 종료되지는 않습니다.Cbash -c 'sleep 1000 & wait "$!"'
bash
sleep
A
표준 입력은 다음으로 리디렉션됩니다/dev/null
.$ bash -c 'readlink /dev/fd/0' /dev/pts/4 $ bash -c 'readlink /dev/fd/0 & wait "$!"' /dev/null
또 다른 차이점은 A | B & wait "$!"
( $!
실행을 마친 프로세스의 pid를 포함하는 B
)에서 의 종료 상태가 A
손실된다는 것입니다( 옵션이 설정되지 않은 경우 의 종료 상태는 $PIPESTATUS
하나의 항목만 포함함 ).wait
B
pipefail
In zsh
, in A | B
, zsh
wait A
및 in B
, 그러나 in A | B & wait $!
에서만 대기합니다 B
(사용하더라도 in 의 종료 상태는 A
손실됩니다 pipefail
).
또 다른 차이점은 신호가 쉘에 전달되면 wait
즉시 처리되어 반환된다는 것입니다(대기 중인 프로세스가 아직 완료되지 않은 경우에도 마찬가지입니다).
비교하다:
$ bash -c 'trap "echo Ouch" TERM; sleep 10 & wait "$!"; echo "$?"' & sleep 1; kill "$!"
[1] 13749
Ouch
143
Ouch
SIGTERM
출력 으로 전송 되면 bash
( sleep 10
종료 후에도 계속) 다음 과 같습니다 bash
.
$ bash -c 'trap "echo Ouch" TERM; sleep 10; echo "$?"' & sleep 1; kill "$!"
[1] 13822
$ Ouch 6:11
0
[1] + done bash -c 'trap "echo Ouch" TERM; sleep 10; echo "$?"'
Ouch
반환 후 출력할 위치입니다 sleep 10
.
스크립트 작성자가 이러한 부작용을 의도했는지 여부는 또 다른 문제입니다. 스크립트에서 다른 많은 오류를 발견하게 될 것이며 스크립트를 작성한 사람은 쉘 스크립팅에 대해 잘 알지 못할 가능성이 높습니다.