Execute dois comandos no caso de || ou &&

10

Eu li sobre && e || e eu gostaria de executar dois comandos no caso falso.

Eu tentei, ;mas isso está sempre funcionando . Eu tentei colocá-lo entre 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ó sai se não houver conexão com a Internet.

Thomas Weller
fonte
11
Parece um simples erro tipográfico. Uma pergunta muito mais interessante a fazer são as diferenças entre ()e {}.
precisa saber é o seguinte

Respostas:

26

Usar 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 de parens, o comando final entre chaves deve ser seguido por ;.

Por que é necessário um ponto-e-vírgula ou uma nova linha

Um colchete é um argumento válido para um comando. Por exemplo, aqui está uma chave como argumento para echo:

$ echo }
}

Conseqüentemente, se o shell vir:

{ command1; command2 }

O shell interpreta command1 como não tendo argumentos e command2 como tendo um argumento que consiste no caractere }. Um colchete }é interpretado apenas como fechar 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 o seguinte é definido xcomo 10, mas que essa configuração é esquecida antes da echoexecução do comando:

$ x=0; false || ( echo Hello; x=10 )
Hello
$ echo $x
0

Com chaves, por outro lado, a configuração de x=10é lembrada:

$ x=0; false || { echo Hello; x=10; }
Hello
$ echo $x
10

A diferença é que atribuições de variáveis ​​em um subshell não sobrevivem após a conclusão do subshell.

Documentação

De man bash:

(Lista)

A lista é executada em um ambiente subshell (consulte AMBIENTE DE EXECUÇÃO DE COMANDO abaixo). As atribuições variáveis ​​e os comandos internos que afetam o ambiente do shell não permanecem em vigor após a conclusão do comando. O status de retorno é o status de saída da lista.

{ Lista; }

A lista é simplesmente executada no ambiente atual do shell. A lista deve ser finalizada com uma nova linha ou ponto e vírgula. Isso é conhecido como um comando de grupo. O status de retorno é o status de saída da lista. Observe que, diferentemente dos metacaracteres (e), {e} são palavras reservadas e devem ocorrer onde uma palavra reservada pode ser reconhecida. Como eles não causam uma quebra de palavra, eles devem ser separados da lista por espaços em branco ou outro metacaractere do shell.

[Enfase adicionada]

John1024
fonte