linha de comando - qual é o objetivo &&
?
Com casca, quando você vê
$ command one && command two
a intenção é executar o comando que segue &&
apenas se o primeiro comando for bem-sucedido. Isso é idiomático dos shells Posix, e não apenas encontrado no Bash.
Ele pretende impedir a execução do segundo processo se o primeiro falhar.
Você pode perceber que eu usei a palavra "intenção" - por uma boa razão. Nem todos os programas têm o mesmo comportamento; portanto, para que isso funcione, você precisa entender o que o programa considera uma "falha" e como ele lida com isso lendo a documentação e, se necessário, o código fonte.
Seu shell considera um valor de retorno 0 para true, outros números positivos para false
Os programas retornam um sinal ao sair. Eles devem retornar 0 se sair com êxito ou maior que zero se não o fizerem. Isso permite uma quantidade limitada de comunicação entre processos.
O &&
é referido como AND_IF
na gramática shell POSIX , que é parte de uma and_or
lista de comandos, que também inclui o ||
que é umOR_IF
com a semântica semelhantes.
Símbolos gramaticais, citados na documentação:
%token AND_IF OR_IF DSEMI
/* '&&' '||' ';;' */
E a gramática (também citada na documentação), que mostra que qualquer número de AND_IF
s ( &&
) e / ou OR_IF
s ( ||
) pode ser unido (como and_or
definido recursivamente):
and_or : pipeline
| and_or AND_IF linebreak pipeline
| and_or OR_IF linebreak pipeline
Ambos os operadores têm precedência igual e são avaliados da esquerda para a direita (eles são deixados associativos). Como dizem os documentos:
Uma AND-OR
lista é uma sequência de um ou mais pipelines separados pelos operadores "&&"
e "||"
.
Uma lista é uma sequência de um ou mais e-ou listas separadas por os operadores ';'
e '&'
e opcionalmente terminado por ';'
, '&'
ou.
Os operadores "&&"
e"||"
devem ter precedência igual e devem ser avaliados com associatividade à esquerda. Por exemplo, os dois comandos a seguir gravam apenas a barra na saída padrão:
$ false && echo foo || echo bar
$ true || echo foo && echo bar
No primeiro caso, o false é um comando que sai com o status de 1
$ false
$ echo $?
1
o que significa echo foo
que não roda (ou seja, curto-circuito echo foo
). Então o comando echo bar
é executado.
No segundo caso, true sai com um código de 0
$ true
$ echo $?
0
e, portanto, echo foo
não é executado, então echo bar
é executado.
false && echo "Will not be printed"
.