Existe alguma diferença entre:
set -e;
./create-git-tag.sh || {
echo 'Could not create git tag.'
exit 1;
}
e
set -e;
if ! ./create-git-tag.sh; then
echo 'Could not create git tag.'
exit 1;
fi
Estou supondo que o bloco if não cria um subshell e, portanto, sairia antes que o bloco if fosse inserido? Eles parecem funcionar da mesma forma, existem diferenças de comportamento?
Colchetes
{ }
não criam subcamadas, colchetes fazem:Portanto, nem a
if
instrução nem o... || { }
formulário têm o potencial de criar um subshell.Um ambiente de subshell pode ser criado se colchetes
( )
forem usados em vez de colchetes. O operador OR||
só permitiria que esse estágio fosse alcançado se o primeiro comando retornasse um status diferente de zero ( ou seja, ./create-git-tag.sh falhou).Se
set -e
for usado, todos os formulários exibirão o mesmo comportamento (se o comando de teste falhar, o shell será encerrado imediatamente) – mas nos bastidores os colchetes terão criado um subshell (o que não parece ser útil neste exemplo).Se
set -e
não fosse usado, criar um subshell com( )
significaria que o subshell sairia, mas o shell de chamada continuaria – os comandos a seguir ainda seriam executados.Em todos os casos, a cadeia de comando echo-exit (e o subshell associado para colchetes) só é inserido após a falha do comando de teste. Mas o propósito de fazer lógica condicional é que algo pode falhar ou não – é aqui que sua redação na pergunta não faz sentido:
O bloco if é "entrado", ele executa o comando test para determinar o que fazer a seguir.
Pessoalmente, acho a
if
declaração mais clara de ler e prefiro usá-la em scripts. Operadores&&
e||
eu podemos usar noif
lugar de quando estou usando o shell "interativamente".Meu entendimento é que eles são equivalentes; em ambos os casos
exit
, encerrará a instância do shell executando o script.Nenhuma das versões do que você criou cria um subshell. Para provar isso, considere os seguintes experimentos:
Se você alterar
{ }
para (como na versãoversion1
a()
seguir), isso criará um subshell. Como resultado, a modificação dex
dentro do( )
não afetax
o shell de chamada: