Execute dois comandos em caso de || ou &&

7

Li sobre & amp; & amp; e || e gostaria de executar dois comandos no caso falso.

Eu tentei ; , mas isso é executando sempre . Eu tentei colocá-lo em chaves { command1; command2 } , mas isso resulta em um erro de sintaxe.

Eu quero fazer algo como

command && echo "Ok, continuing" || echo "Check internet connection"; exit 1

que só é encerrado se não houver conexão com a Internet.

    
por Thomas Weller 28.08.2016 / 23:33

1 resposta

21

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]

    
por John1024 28.08.2016 / 23:37