¿Cuál es la diferencia entre doble ampersand (&&) y punto y coma (;) en Linux Bash?

112

¿Cuál es la diferencia entre ampersand y punto y coma en Linux Bash ?

Por ejemplo,

$ command1 && command2

vs

$ command1; command2
Steve K
fuente
6
Respondí esto aquí: superuser.com/a/619019/107862
Etan Reisner
9
Con respecto al tema fuera de tema, la última vez que lo verifiqué, bash seguía siendo un lenguaje de programación, pero antes estaba equivocado y podría ser un caramelo de frutos secos.
Steve K
Lo es, y si estuviera haciendo una pregunta sobre un comportamiento específico o la forma correcta de hacer una determinada cosa, sin duda estaría en el tema. Esto cae en una categoría más gris de "pregunta sobre la sintaxis de un lenguaje" que no es tan claramente una pregunta de "programación" en lo que a mí respecta.
Etan Reisner
4
bash es en cierto modo seco y en cierto modo dulce. Al final del día es bastante agradable y digerible. Sin embargo, no se puede robar fácilmente a los bebés.
code_monk

Respuestas:

138

El &&operador es un operador AND booleano: si el lado izquierdo devuelve un estado de salida distinto de cero, el operador devuelve ese estado y no evalúa el lado derecho (cortocircuita), de lo contrario evalúa el lado derecho y devuelve su estado de salida . Esto se usa comúnmente para asegurarse de que command2solo se ejecute si se command1ejecuta correctamente.

El ;token solo separa los comandos, por lo que ejecutará el segundo comando independientemente de si el primero tiene éxito o no.

cdhowie
fuente
6
¿Es el doble ampersand &&diferente de un simple ampersand &en bash?
Charlie Parker
16
@CharlieParker &hace que el comando se ejecute en segundo plano, así que sí. "Ejecutar esto en segundo plano" es muy diferente de "ejecutar este siguiente comando sólo si este otro tiene éxito".
cdhowie
El comando2 solo ejecutará el comando1 devolvió el estado de salida cero , lo que significa que terminó con éxito ..
Nik
33

comando1 && comando2

command1 && command2se ejecuta command2si (y solo si) la command1ejecución finaliza correctamente. En la jerga de Unix, eso significa código de salida / código de retorno igual a cero.

comando1; comando2

command1; command2se ejecuta command2después de ejecutar command1, secuencialmente. No importa si los comandos tuvieron éxito o no.

jimm-cl
fuente
6

La primera es una lógica simple que ANDusa evaluación de cortocircuito, la última simplemente delimita dos comandos.

Lo que sucede en real es que cuando el primer programa devuelve un código de salida distinto de cero, el conjunto ANDse evalúa FALSEy el segundo comando no se ejecutará. El último simplemente los ejecuta a ambos en orden.

Danstahr
fuente