Qual é o significado do padrão bash [...] & wait $!
? Por exemplo:
curl -LsS $AZP_AGENT_PACKAGE_LATEST_URL | tar -xz & wait $!
Eu entendo isso como:
- O
&
instrui o bash a executar o pipeline anterior em um subshell em segundo plano. - O
wait $!
então espera que o pipeline termine antes de retornar.
Mas se for esse o caso, qual é a diferença de apenas executar o pipeline em si? Qual é o ponto?
O script que contém este exemplo (e algumas outras instâncias) pode ser encontrado em:
https://docs.microsoft.com/en-us/azure/devops/pipelines/agents/docker?view=azure-devops
Existem dois efeitos colaterais de executar um comando de forma assíncrona em um shell não interativo que torna
A
eA & wait "$!"
diferente:SIGINT e SIGQUIT são ignorados para
A
. Se você pressionar Ctrl+ C, enquanto estiver executandobash -c 'sleep 1000 & wait "$!"'
, notará quebash
está encerrado, mas nãosleep
.A
stdin de é redirecionado para/dev/null
:Outra diferença é que em
A | B & wait "$!"
(onde$!
contém o pid do processo eventualmente em execuçãoB
), o status de saída deA
é perdido ($PIPESTATUS
conterá apenas uma entrada, o status de saída dewait
, que será o deB
se apipefail
opção não estiver definida).Em
zsh
, emA | B
,zsh
espera por ambosA
eB
, mas emA | B & wait $!
apenas espera porB
(e o status de saída deA
é perdido mesmo compipefail
).Outra diferença é que se um sinal for entregue ao shell, ele será tratado imediatamente e
wait
retornará (mesmo que o processo que está esperando não tenha terminado).Comparar:
Onde
Ouch
é a saída assim queSIGTERM
é enviada parabash
(esleep 10
continua em execução após obash
término) com:Onde
Ouch
é emitido somente após ossleep 10
retornos.Se algum desses efeitos colaterais foi desejado pelo autor do roteiro é outra questão. Você notará muitos outros erros nesse script, é muito bem possível que quem escreveu esse script não saiba muito sobre shell script.