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

307

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 & esteja 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 de || até o comentário de Kaya.

As seguintes questões lidam com a diferença entre os dois conectores, mas o fazem principalmente nos comentários:

Então, aqui estão algumas perguntas 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. Quais são as vantagens e perigos ? Robie Basak menciona em um comentário para esta resposta que um comando como cd /somewhere_else; rm -Rf * pode ter consequências destrutivas se o primeiro elemento na cadeia de comando falhar, por exemplo.
  4. Se relevante, de onde eles vêm?
por don.joey 20.08.2013 / 18:41

4 respostas

562

Cheatsheet:

A; B    # Run A and then B, regardless of success of A
A && B  # Run B if A succeeded
A || B  # Run B if A failed
A &     # Run A in background.
    
por Jack 20.10.2014 / 13:02
76

&& somente executa o segundo comando se o primeiro sair com status 0 (teve êxito). ; executa ambos os comandos, mesmo que o primeiro saia com um status diferente de zero.

Seu exemplo com && pode ser parafraseado de forma equivalente como

if sudo apt-get update ; then
    sudo apt-get install pyrenamer
fi
    
por choroba 20.08.2013 / 18:46
28

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

usando && executar 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 for bem-sucedido.

Portanto, para comandos dependentes, você deve usar &&

Wring bash, ou comandos com comandos independentes usam ;

Portanto, se você quiser desligar o computador, mesmo que o primeiro trabalho falhe, use ; , mas se desejar obter o sucesso completo do primeiro trabalho, inicie o desligamento usando &&

    
por Web-E 20.08.2013 / 18:50
12

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

Isso é necessário e suficiente para responder às 3 primeiras perguntas. 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 do Bash .

Não há perigo intrínseco em usar qualquer um deles. Mais uma vez, a definição acima é suficiente. Isso significa que você escreverá && quando b tiver efeitos indesejados se a não for bem-sucedido. Não há necessidade de mais regras ou explicações, IMHO.

    
por ignis 20.08.2013 / 23:05