¿Cuál es la diferencia entre "command && command" y "command; mando"

49

Veo estos dos usos en Ubuntu "command && command" y "command; command",
por ej.apt-get update && apt-get upgrade

¿Qué diferiría si lo uso apt-get update; apt-get upgrade?
No solicito este uso específico, pero en general, ¿cuál es la diferencia entre estos dos usos?

maldad
fuente
2
Gana el comando de la línea y por lotes tienen la misma característica: & (simple sequencing), && (conditional AND) and || (conditional OR).
Karan
55
Consulte también: Manual de referencia de Bash - Lista de comandos . En general, no hay nada que no pueda encontrar en la documentación; Realmente vale la pena mirar si tiene una pregunta sobre elementos de sintaxis específicos.
slhck
1
@Karan Y para completar, bash (linux / Ubuntu) también lo ha hecho ||.
Izkata

Respuestas:

88

&&Es un operador lógico. ;Es una secuencia simple.

En cmd1 && cmd2, cmd2 solo se ejecutará si cmd1 sale con un código de retorno exitoso.

Mientras que en cmd1; cmd2cmd2 se ejecutará independientemente del estado de salida de cmd1 (suponiendo que no haya configurado su shell para salir en caso de falla en su script o algo así).

En una nota relacionada, con el cmd1 || cmd2uso del ||operador lógico 'OR', cmd2 solo se ejecutará si cmd1 falla (devuelve un código de salida distinto de cero).

Estos operadores lógicos a veces se usan en scripts en lugar de una instrucción if básica. Por ejemplo,

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

... se puede lograr de manera más concisa con:

[[ -f "$foo" ]] && mv "$foo" "${foo%.txt}.mkd"
Etan Reisner
fuente
Me parece un poco falaz porque, según tengo entendido, el código de retorno exitoso significa 0, que, cuando se convierte en bool, da un falso lógico. Entonces, siguiendo la filosofía de la evaluación de Mccarthy utilizada en la mayoría de los idiomas, debería devolver inmediatamente falso en lugar de evaluar (ejecutar) la siguiente declaración.
Della
33

Sintaxis

command1 && command2

command2 se ejecuta si, y solo si,command1devuelve un estado de salida de cero ( verdadero ). En otras palabras, ejecutecommand1y, si tiene éxito, ejecutecommand2.

command1 ; command2

Tanto el comando1 como el comando2 se ejecutarán independientemente. El punto y coma le permite escribir muchos comandos en una línea.

Relacionado :

command1 || command2

command2 se ejecuta si, y solo si, command1 devuelve un estado de salida distinto de cero. En otras palabras, corre concommand1éxito o correcommand2.


Ejemplo

&& operador:

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

; operador:

$ echo "foo" ; echo "bar"

|| operador:

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

Enlaces externos

  1. Linuxtopia.org
  2. Tldp.org
stderr
fuente