Por que essa diferença importa? Os dois blocos no código abaixo diferem na última linha:
#!/bin/bash
if [[ -n "$1" ]]; then
sleep 1 &
p=$!
kill $p &> /dev/null
else
sleep 1 &
p=$!
kill $p &> /dev/null
/bin/true # This line is the sole difference.
fi
Nomeie-o a.sh
e eu recebo (na minha caixa do Linux)
$ ./a.sh
/a.sh: line 16: 18103 Terminated sleep 1
$ ./a.sh foo
$ # no "Terminated" message
Por que nenhuma mensagem no segundo caso? O comportamento básico do Bash é imprimir "Terminated" ( consulte esta pergunta ).
(NB eu uso p=$!
no meu código verdadeiro, mas no caso acima você pode usar kill $!
.)
EDIT: Sergiy Kolodyazhnyy gentilmente se referiu à pergunta " Por que o verdadeiro e o falso são tão grandes? " em um comentário. (É uma digressão, mas uma leitura divertida.) Infelizmente, a resposta a que o comentário pertencia foi deletada, então eu a registro aqui. Obrigado Sergiy.
De acordo com a resposta de Matteo Italia :
Em outras palavras, o atraso causado pela chamada do externo
/bin/true
causa um atraso, o que permite que o shell imprima a mensagem.Eu também realizei testes com
/bin/echo
vsecho
:Com este roteiro:
Com embutido
echo
:Em outras palavras, o fato de haver um executável externo sendo chamado força o shell a executar a verificação de processos filho e trabalhos em segundo plano quando o último filho retornar. No caso de:
do seu script original, não há nenhum comando extra sendo chamado, apenas o último integrado.
Entre outras coisas, realizei alguns testes com
strace
:Parece que o processo pai sai e não espera pelo filho. Em outras palavras, o processo pai do shell sai muito cedo para executar uma verificação explícita.
Notavelmente, no rastreamento com parâmetro posicional, a chamada de espera também está ausente: