¿Hay alguna diferencia entre cómo dos ampersands y un punto y coma operan en bash?

71

Si quisiera ejecutar dos comandos separados en una línea, podría hacer esto:

cd /home; ls -al

o esto:

cd /home && ls -al

Y obtengo los mismos resultados. Sin embargo, ¿qué está sucediendo en el fondo con estos dos métodos? ¿Cuál es la diferencia funcional entre ellos?

Sean P
fuente

Respuestas:

88

El ;justo separa un comando de otro. El &&dice solo ejecuta el siguiente comando si el anterior fue exitoso

cd /home; ls -al

Esto lo hará cd /homee incluso si el cdcomando falla ( /homeno existe, no tiene permiso para atravesarlo, etc.), se ejecutará ls -al.

cd /home && ls -al

Esto solo se ejecutará ls -alsi cd /homefue exitoso.

user9517 es compatible con GoFundMonica
fuente
2
el uso de ; es realmente peligroso (al menos con el comando rm), por ejemplo cd /some/dir; rm -fr ./*. Entonces, con una operación tan destructiva, debe asegurarse de estar en el lugar correcto antes de ejecutar rm. El comando correcto escd /some/dir && rm -fr ./*
ALex_hha
70
a && b

si a devuelve un código de salida cero, entonces se ejecuta b .

a || b

si a devuelve un código de salida distinto de cero, entonces b se ejecuta.

a ; b

a se ejecuta y luego se ejecuta b .

Canción Minsuk
fuente
16
cd /fakedir; ls -al

Se ejecuta lsen el directorio actual porque cd /fakedirfallará y el shell ignorará el estado de salida que no es cero.

cd /fakedir && ls -al

Debido a que el &&operador solo continuará si el comando anterior salió normalmente (estado de cero), no lsse realizará ninguna operación.

Hay otros operadores, como los &que serán el fondo de un proceso. Aunque a menudo se coloca al final de un comando, se puede poner en el medio de una cadena.

Jeff Ferland
fuente
4

También puede unirlos como if..then..elsepara encadenar la lógica de comando.

ejemplo:

ls file.ext && echo "file exists" || echo "file does not exist"
Mtl Dev
fuente