O uso de parens coloca os comandos em um subshell que nem sempre é o que você deseja. Como alternativa, use chaves:
command && echo "Ok, continuing" || { echo "Check internet connection"; exit 1; }
O truque aqui é que, ao contrário dos parens, o comando final entre chaves deve ser seguido por ;
.
Por que um ponto-e-vírgula ou nova linha é necessário
Uma chave é um argumento válido para um comando. Por exemplo, aqui está uma chave como um argumento para echo
:
$ echo }
}
Consequentemente, se a concha vir:
{ command1; command2 }
O shell interpreta o comando1 como não tendo argumentos e o comando2 como tendo um argumento que consiste no caractere }
. Uma chave }
é interpretada apenas como fechamento de um agrupamento se seguir um ponto-e-vírgula ou uma nova linha. Para fazer o trabalho acima:
{ command1; command2; }
Subshells e a diferença entre {...}
e (...)
Observe que os conjuntos a seguir x
to 10, mas que essa configuração é esquecida antes da execução do comando echo
:
$ x=0; false || ( echo Hello; x=10 )
Hello
$ echo $x
0
Com chaves, por contraste, a configuração de x=10
é lembrada:
$ x=0; false || { echo Hello; x=10; }
Hello
$ echo $x
10
A diferença é que as atribuições de variáveis em um subshell não sobrevivem depois que a subshell é concluída.
Documentação
De man bash
:
(lista)
a lista é executada em um ambiente de subshell (veja a EXECUÇÃO DO COMANDO MEIO AMBIENTE abaixo). Atribuições variáveis e comandos incorporados que afetar o ambiente do shell não permanecem em vigor depois que o comando for concluído. O status de retorno é o status de saída de lista.
{list; }
A listaé simplesmente executada no ambiente atual do shell. lista deve ser terminado com uma nova linha ou ponto e vírgula. Isso é conhecido como um grupo comando. O status de retorno é o status de saída da lista. Observe que ao contrário dos metacaracteres (e), {e} são palavras reservadas e deve ocorrer onde uma palavra reservada tem permissão para ser reconhecida. Como eles não causam uma quebra de palavra, eles devem ser separados da lista por espaço em branco ou outro metacaractere de concha.
[ênfase adicionada]