qual é a diferença entre "command && command" e "command; comando"

49

Eu vejo esses dois usos no Ubuntu "command && command" e "command; command",
por exemploapt-get update && apt-get upgrade

O que seria diferente se eu usasse apt-get update; apt-get upgrade?
Não estou pedindo esse uso específico, mas em geral qual é a diferença entre esses dois usos?

evilsoup
fonte
2
Win-linha de comando e lote tem a mesma característica: & (simple sequencing), && (conditional AND) and || (conditional OR).
Karan
5
Consulte também: Manual de Referência do Bash - Lista de comandos . Em geral, não há nada que você não encontre na documentação; realmente vale a pena examinar se você tiver alguma dúvida sobre elementos de sintaxe específicos.
slhck
11
@ Karan E, para completar, o bash (linux / Ubuntu) ||também.
Izkata 12/07/2013

Respostas:

88

&&é um operador lógico. ;é um sequenciamento simples.

Em cmd1 && cmd2, o cmd2 será executado apenas se o cmd1 sair com um código de retorno bem-sucedido.

Enquanto que o cmd1; cmd2cmd2 será executado independentemente do status de saída do cmd1 (supondo que você não tenha configurado o shell para sair em todas as falhas do script ou algo assim).

Em uma nota relacionada, com o cmd1 || cmd2uso do ||operador lógico 'OR', o cmd2 será executado apenas se o cmd1 falhar (retorna um código de saída diferente de zero).

Esses operadores lógicos às vezes são usados ​​em scripts no lugar de uma instrução if básica. Por exemplo,

if [[ -f "$foo" ]]; then mv "$foo" "${foo%.txt}.mkd"; fi

... pode ser alcançado de forma mais concisa com:

[[ -f "$foo" ]] && mv "$foo" "${foo%.txt}.mkd"
Etan Reisner
fonte
Acho isso um pouco falacioso porque, pelo meu entendimento, código de retorno bem-sucedido significa 0, que, quando convertido em bool, gera um falso lógico. Então, seguindo a filosofia da avaliação de Mccarthy usada na maioria dos idiomas, ela deve retornar imediatamente falsa, em vez de avaliar (executando) a próxima declaração.
Della
33

Sintaxe

command1 && command2

command2 é executado se, e somente se,command1retorna um status de saída igual a zero ( verdadeiro ). Em outras palavras, executecommand1e, se tiver êxito, executecommand2.

command1 ; command2

Ambos command1 e command2 será executado independentemente. O ponto e vírgula permite que você digite muitos comandos em uma linha.

Relacionado :

command1 || command2

command2 é executado se, e somente se, command1 retorna um status de saída diferente de zero. Em outras palavras, execute comcommand1sucesso ou executecommand2.


Exemplo

&& operador:

$ rm /tmp/filename && echo "File deleted"

; operador:

$ echo "foo" ; echo "bar"

|| operador:

$ cat /tmp/filename 2>/dev/null || echo "Failed to open file"

Links externos

  1. Linuxtopia.org
  2. Tldp.org
stderr
fonte