Qual é o propósito de “&&” em um comando shell?

Tanto quanto eu sei, usando & após o comando é para executá-lo em segundo plano.

Exemplo de & usage: tar -czf file.tar.gz dirname &

Mas e quanto ao && ? (veja este exemplo: https://serverfault.com/questions/215179/centos-100-disk-full-how-to-remove-log-files-history-etc#answer-215188 )

&& permite que você faça algo com base no fato de o comando anterior ter sido concluído com êxito – é por isso que você tende a vê-lo encadeado como do_something && do_something_else_that_depended_on_something .

Além disso, você também tem || qual é o lógico ou, e também ; que é apenas um separador que não se importa com o que aconteceu antes do comando.

 $ false || echo "Oops, fail" Oops, fail $ true || echo "Will not be printed" $ $ true && echo "Things went well" Things went well $ false ; echo "This will always run" This will always run 

Alguns detalhes sobre isso podem ser encontrados aqui Lists of Commands no Bash Manual.

linha de comando – qual é o propósito de && ?

No shell, quando você vê

 $ command one && command two 

a intenção é executar o comando que segue o && somente se o primeiro comando for bem-sucedido. Isto é idiomático de shells Posix, e não só encontrado em Bash.

Ele pretende impedir a execução do segundo processo se o primeiro falhar.

Processos retornam 0 para true, outros números positivos para false

Programas retornam um sinal ao sair. Eles devem retornar 0 se saírem com êxito ou maiores que zero se não saírem. Isso permite uma quantidade limitada de comunicação entre processos.

O && é referido como AND_IF na gramática da shell posix , que é parte de uma lista de comandos and_or , que também inclui o || que é um OR_IF com semântica similar.

Símbolos gramaticais:

 %token AND_IF OR_IF DSEMI /* '&&' '||' ';;' */ 

Gramática:

 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 associativos) Por exemplo, o seguinte:

 $ false && echo foo || echo bar $ true || echo foo && echo bar 

ambos ecoam apenas bar .

  1. No primeiro caso, o falso é um comando que sai com o status de 1

     $ false $ echo $? 1 

    o que significa que echo foo não roda (ie, shortcircuiting echo foo ). Então a echo bar comando é executada.

  2. No segundo caso, true sai com um código de 0

     $ true $ echo $? 0 

    e, portanto, echo foo não é executado, então a echo bar é executada.

Um uso bastante comum para ‘&&’ é compilar software com autotools. Por exemplo:

 ./configure --prefix=/usr && make && sudo make install 

Basicamente, se o configure for bem-sucedido, make é executado para compilar e, se isso for bem-sucedido, o make será executado como root para instalar o programa. Eu uso isso quando tenho certeza de que as coisas vão funcionar, e isso me permite fazer outras coisas importantes, como olhar para o stackoverflow e não ‘monitorar’ o progresso.

Às vezes eu fico realmente empolgado …

 tar xf package.tar.gz && ( cd package; ./configure && make && sudo make install ) && rm package -rf 

Eu faço isso quando, por exemplo, fazendo um linux a partir da checkbox zero.

&& strings comandos juntos. Os comandos sucessivos só são executados se os precedentes forem bem-sucedidos.

Da mesma forma, || permitirá que o comando sucessivo seja executado se o precedente falhar.

Veja Bash Shell Programming .

Veja o exemplo:

 mkdir test && echo "Something" > test/file 

O Shell tentará criar um test diretório e, somente se tiver êxito , tentará criar um arquivo dentro dele.

Então você pode interromper uma sequência de etapas se uma delas falhar.

command_1 && command_2 : execute o comando_2 somente quando command_1 for executado com sucesso.

command_1 || command_2 command_1 || command_2 : execute o comando_2 somente quando command_1 não for executado com sucesso.

Parece similar como uma condição ‘if’ é executada em uma linguagem de programação mainstream, como, em if (condition_1 && condition_2){...} condição_2 será omitida se condição_1 for false e if (condition_1 || condition_2){...} condition_2 será omitido se condition_1 for true . Veja, é o mesmo truque que você usa para codificar 🙂

É executar uma segunda instrução se a primeira instrução terminar com sucesso. Como uma declaração if:

  if (1 == 1 && 2 == 2) echo "test;" 

Sua primeira tenta se 1 == 1, se isso for verdade, verifica se 2 == 2