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_IFna gramática shell POSIX , que é parte de uma and_orlista 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_IFs ( &&) e / ou OR_IFs ( ||) pode ser unido (como and_ordefinido 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-ORlista é 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 fooque 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 foonão é executado, então echo baré executado.
false && echo "Will not be printed".