Qual é a diferença entre "e comercial" duplo (&&) e ponto e vírgula (;) no Linux Bash?

112

Qual é a diferença entre "e" comercial e ponto e vírgula no Linux Bash ?

Por exemplo,

$ command1 && command2

vs

$ command1; command2
Steve K
fonte
6
Eu respondi aqui: superuser.com/a/619019/107862
Etan Reisner
9
Em relação à falta de tópico, da última vez que verifiquei, bash ainda era uma linguagem de programação, mas eu estava errado antes e poderia ser algum doce de frutas secas.
Steve K,
É, e se você estivesse fazendo uma pergunta sobre um comportamento específico ou a maneira certa de fazer uma determinada coisa, certamente estaria no assunto. Isso cai em uma categoria mais cinza de "questão sobre a sintaxe de uma linguagem", que não é tão claramente uma questão de "programação" no que me diz respeito.
Etan Reisner
4
bash é em alguns aspectos seco, e em alguns aspectos doce. No final do dia é bastante agradável e digerível. No entanto, não pode ser facilmente roubado de bebês.
code_monk de

Respostas:

138

O &&operador é um operador booleano AND: se o lado esquerdo retorna um status de saída diferente de zero, o operador retorna esse status e não avalia o lado direito (causa um curto-circuito), caso contrário, avalia o lado direito e retorna seu status de saída . Isso é comumente usado para garantir que command2seja executado apenas se command1executado com êxito.

O ;token apenas separa os comandos, então ele executará o segundo comando, independentemente de o primeiro ser bem-sucedido ou não.

Cdhowie
fonte
6
O E comercial duplo é &&diferente de um único e comercial &no bash?
Charlie Parker
16
@CharlieParker &faz com que o comando seja executado em segundo plano, então sim. "Executar em segundo plano" é muito diferente de "executar este próximo comando apenas se este outro for bem-sucedido".
cdhowie
O command2 só executará o command1 e retornou o status de saída zero , o que significa que foi concluído com êxito.
Nik
33

comando1 && comando2

command1 && command2executa command2se (e somente se) a command1execução terminar com sucesso. No jargão do Unix, isso significa código de saída / código de retorno igual a zero.

command1; command2

command1; command2executa command2após a execução command1, sequencialmente. Não importa se os comandos foram bem-sucedidos ou não.

Jimm-cl
fonte
6

O primeiro é uma lógica simples que ANDusa avaliação de curto-circuito, o último simplesmente delimita dois comandos.

O que acontece na realidade é que quando o primeiro programa retorna um código de saída diferente de zero, o todo ANDé avaliado FALSEe o segundo comando não é executado. O último simplesmente executa os dois em ordem.

Danstahr
fonte