Bash / sh: diferencia entre && y;

136

Normalmente suelo ;combinar más de un comando en una línea, pero algunas personas prefieren &&. ¿Hay alguna diferencia? Por ejemplo, cd ~; cd -y cd ~ && cd -parece hacer lo mismo. ¿Qué versión es más portátil, por ejemplo, será compatible con un subconjunto bash como el shell de Android o algo así?

psihodelia
fuente

Respuestas:

193

Si el comando anterior falló, ;se ejecutará el segundo.

Pero con &&el segundo no se ejecutará.

Este es un "flojo" lógico "Y" operando entre operaciones.

encender
fuente
2
En otras palabras, tiene un comportamiento de cortocircuito
peterchaula
@peter ¿Cuál? ¿El ;uno o el &&uno? ¿O te refieres a ambos?
Shayan
@Shayan, el &&.
Peterchaula
57

Estoy usando &&porque hace mucho tiempo en la computadora cercana:

root# pwd
/
root# cd /tnp/test; rm -rf *
cd: /tnp/test: No such file or directory
...
... and after a while ...
...   
^C

pero no ayudó ...;)

cd /tnp/test && rm -rf * es seguro... ;)

jm666
fuente
26
Para estar más seguro, usaríarm -rf /tnp/test
melvynkim
55
Para estar aún más seguro, es mejor usarlo rm /tnp/test/ -rfpara evitar el ingreso mortal de clics erróneos
radrow
22

En cmd1 && cmd2, cmd2solo se ejecuta si cmd1tiene éxito (devuelve 0).

En cmd1 ; cmd2, cmd2se ejecuta en cualquier caso.

Ambas construcciones son parte de un shell compatible con POSIX.

Pascal Cuoq
fuente
11

&&significa ejecutar el siguiente comando si el anterior salió con el estado 0. Para lo contrario, use, por ||ejemplo, para ejecutarse si el comando anterior sale con un estado que no es igual a 0, ;siempre se ejecuta.

Muy útil cuando necesita realizar una acción en particular dependiendo de si el comando anterior terminó bien o no.

Fredrik Pihl
fuente
5

Los comandos separados por ;se ejecutan secuencialmente independientemente de su estado de finalización.

Con &&, el segundo comando se ejecuta solo si el primero se completa con éxito (devuelve el estado de salida de 0).

Esto está cubierto en la página de manual de bash debajo Lists. Esperaría que cualquier shell similar a Unix admita ambos operadores, pero no sé específicamente sobre el shell de Android.

Dave Costa
fuente
2
Aquí hay un enlace al manual de bash: gnu.org/software/bash/manual/bashref.html#Lists
glenn jackman
3

&&permite la ejecución condicional mientras ;siempre se ejecuta el segundo comando.

En p command1 && command2. Ej. , command2Solo se ejecutará cuando command1haya terminado con exit 0, señalizando que todo salió bien, mientras que en command1 ; command2el segundo comando siempre se ejecutará sin importar el resultado command1.

Marcel
fuente
1

&& es lógico Y en bash. Bash tiene una evaluación de cortocircuito de AND lógico. Este modismo es una forma más simple de expresar lo siguiente:


cmd1;rc=$?
if [ $rc -eq 0 ]; then
   cmd2
fi

Mientras que el ; la versión es simplemente:


cmd1
cmd2
frankc
fuente