`[...] & wait $!`의 의미

`[...] & wait $!`의 의미

bash 모드의 의미는 무엇입니까 [...] & wait $!? 예를 들어:

curl -LsS $AZP_AGENT_PACKAGE_LATEST_URL | tar -xz & wait $!

나는 이것을 다음과 같이 이해합니다.

  1. &백그라운드 하위 셸에서 이전 파이프라인을 실행하도록 bash에 지시합니다 .
  2. 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 "$!"'bashsleep

  • 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하나의 항목만 포함함 ).waitBpipefail

In zsh, in A | B, zshwait 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

OuchSIGTERM출력 으로 전송 되면 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.

스크립트 작성자가 이러한 부작용을 의도했는지 여부는 또 다른 문제입니다. 스크립트에서 다른 많은 오류를 발견하게 될 것이며 스크립트를 작성한 사람은 쉘 스크립팅에 대해 잘 알지 못할 가능성이 높습니다.

관련 정보