Questão Qual é o melhor: usando; ou && para executar vários comandos em uma linha?


Nos tutoriais e nas instruções, vejo frequentemente comandos combinados. Por exemplo,

sudo apt-get update && sudo apt-get install pyrenamer

Parece haver quatro conectores possíveis: &, &&, || e ;. Embora o &  conector é claro para mim (ele envia um processo para o segundo plano e deixa o terminal disponível), não está claro qual é a diferença entre && e ;. E eu não sabia || até o comentário de Kaya.

As perguntas a seguir lidam com a diferença entre os dois conectores, mas o fazem principalmente nos comentários:

Então, aqui estão algumas questões relacionadas:

  1. Qual é a diferença entre ; e &&?
  2. Quando você deve usá-los? respectivamente? Seria bom ver alguns casos de uso: se eu quiser executar um comando e depois desligar meu computador, qual conector devo escolher?
  3. O que são eles vantagens e perigos? Robie Basak menciona em um comentário para esta resposta que um comando como cd /somewhere_else; rm -Rf * pode ter conseqüências destrutivas se o primeiro elemento na cadeia de comando falhar, por exemplo.
  4. Se relevante, de onde eles vêm?

332
2017-08-20 16:41


origem


Existe outro conector que você pode não encontrar: ||é o mesmo que && exceto que ele somente executa o segundo comando se o primeiro sair com um status diferente de zero (malsucedido). - Kaya
Observe também que executar seu script com set -e irá parar o script em falha como se todos os comandos estivessem conectados com &&. - choroba
stackoverflow.com/questions/3573742/… - Ciro Santilli 新疆改造中心 六四事件 法轮功
Ninguém respondeu Qn 4 ... Eu suspeito que o comportamento de && e || foi inspirado na linguagem de programação C. No caso de (x && y), se x for false, toda a expressão deve ser falsa, portanto, um compilador pode otimizar a avaliação de y, caso seja caro. Os modernos padrões C e C ++, na verdade exigir essa otimização, portanto, os programas podem assumir com segurança que y não será avaliado se x for falso. Por exemplo, (ptr && ptr-> days> 31) não irá falhar mesmo que ptr seja nulo. Também em C, as instruções terminam com; independentemente de haver outra declaração na mesma linha ou não. - Kevin


Respostas:


Folha de dicas:

A; B    # Run A and then B, regardless of success of A
A && B  # Run B if and only if A succeeded
A || B  # Run B if and only if A failed
A &     # Run A in background.

608
2017-10-20 11:02



E claro, A & B &: Execute A em segundo plano, depois execute B em segundo plano (independentemente do sucesso) e retorne o controle para o shell. Isso geralmente funciona da mesma maneira que executar os dois processos ao mesmo tempo. - Limited Atonement
É possível dizer: executar um plano de fundo, seguido por b em segundo plano somente se um funcionou? ( Eu acho &&& ?) - user230910
@ user230910: isso seria (A && B) &. - leftaroundabout
Você pode referenciar documento autoritativo para isso? - Jaime Hablutzel
@Jack Quando executado a partir de Cronjob, não segue esta regra, alguma ideia porquê? Para um arquivo python - CodeGuru


&& só executa o segundo comando se o primeiro sair com status 0 (foi bem-sucedido). ; executa ambos os comandos, mesmo se o primeiro sair com um status diferente de zero.

Seu exemplo com && pode ser parafraseado de forma equivalente

if sudo apt-get update ; then
    sudo apt-get install pyrenamer
fi

77
2017-08-20 16:46



Obrigado. Eu atualizei a questão para garantir que as diferentes subquestões sejam facilmente distinguíveis. - don.joey
@Private: você deve usar ; se o segundo comando não precisar que o anterior seja bem-sucedido. - choroba


Usando ; executará os comandos independentemente de o primeiro comando ser bem-sucedido ou não.

usando && execute o segundo comando somente quando o primeiro comando for executado com sucesso (status 0).

Ambos são usados ​​em diferentes perspectivas. Como para um processo mais longo, digamos que para uma instalação você precisa compilá-lo e instalá-lo. você deve make && make install. Portanto, a instalação será executada apenas se make bem sucedido.

Então, para comandos dependentes você deve usar &&

Wring bash, ou comandos com comandos independentes usam ; 

Então, se você quiser desligar o computador, mesmo que o primeiro trabalho falhe, use ; , mas se quiser no sucesso completo do primeiro trabalho iniciar o uso do desligamento &&


28
2017-08-20 16:50



Obrigado. Eu gosto do último caso de uso que você apresenta. Eu atualizei a questão. - don.joey


a ; b irá executar b independentemente do status de saída de um. a && b irá executar b apenas se for bem sucedido.

Isso é necessário e suficiente para responder às três primeiras questões. Em particular, o 2 é muito amplo, e não pode receber "uma" resposta definitiva - sua melhor opção é decidir caso a caso.

Quanto à 4ª questão: Eles são a sintaxe Bash.

Não há perigo intrínseco em usar qualquer um deles. Mais uma vez, a definição acima é suficiente. Isso implica que você vai escrever && quando b tem efeitos não intencionais se a não tem sucesso. Não há necessidade de mais regras ou explicações, IMHO.


13
2017-08-20 21:05