Cuál es mejor: usar; o && para ejecutar múltiples comandos en una línea?

330

En tutoriales y procedimientos, a menudo veo comandos combinados. Por ejemplo,

sudo apt-get update && sudo apt-get install pyrenamer

Parece haber cuatro posibles conectores: & , && , || y ; . Aunque el conector & es claro para mí (envía un proceso al fondo y deja el terminal disponible), no está claro cuál es la diferencia entre && y ; . Y no sabía de || hasta el comentario de Kaya.

Las siguientes preguntas se refieren a la diferencia entre los dos conectores, pero lo hacen principalmente en los comentarios:

Así que aquí hay una serie de preguntas relacionadas:

  1. ¿Cuál es la diferencia entre ; y && ?
  2. ¿Cuándo debería usarlos , respectivamente? Sería bueno ver algunos casos de uso: si quiero ejecutar un comando y luego apagarlo, ¿qué conector debería elegir?
  3. ¿Cuáles son sus ventajas y peligros ? Robie Basak menciona en un comentario a esta respuesta que un comando como cd /somewhere_else; rm -Rf * puede tener consecuencias destructivas si el primer elemento de la cadena de comandos falla, por ejemplo.
  4. Si es relevante, ¿de dónde vienen?
pregunta don.joey 20.08.2013 - 18:41

4 respuestas

599

Cheatsheet:

A; B    # Run A and then B, regardless of success of A
A && B  # Run B if and only if A succeeded
A || B  # Run B if and only if A failed
A &     # Run A in background.
    
respondido por el Jack 20.10.2014 - 13:02
77

&& solo ejecuta el segundo comando si el primero salió con el estado 0 (fue exitoso). ; ejecuta ambos comandos, incluso si el primero sale con un estado distinto de cero.

Tu ejemplo con && se puede parafrasear de manera equivalente como

if sudo apt-get update ; then
    sudo apt-get install pyrenamer
fi
    
respondido por el choroba 20.08.2013 - 18:46
28

El uso de ; ejecutará los comandos, independientemente de si el primer comando es exitoso o no.

utilizando && ejecute el 2º comando solo cuando el primer comando se ejecuta correctamente (estado 0).

Ambos se usan en diferentes perspectivas. Al igual que para un proceso más largo, por ejemplo, para una instalación, necesita compilarlo e instalarlo. deberías make && make install . Por lo tanto, la instalación solo se ejecutará si make tiene éxito.

Entonces, para los comandos dependientes, debe usar &&

Wring bash, o comandos con comandos independientes usan ;

Entonces, si quiere apagar la computadora, incluso si falló el primer trabajo, use ; , pero si lo desea con éxito completo del primer trabajo, inicie el apagado use &&

    
respondido por el Web-E 20.08.2013 - 18:50
13

a ; b ejecutará b independientemente del estado de salida de a. a && b ejecutará b solo si tiene éxito.

Esto es necesario y suficiente para responder a las primeras 3 preguntas. En particular, el 2 es demasiado amplio y no se le puede dar "una" respuesta definitiva; su mejor opción es decidir caso por caso.

En cuanto a la 4ª pregunta: Son la sintaxis de Bash .

No hay peligro intrínseco en el uso de cualquiera de los dos. De nuevo, la definición anterior es suficiente. Implica que escribirás && cuando b tiene efectos involuntarios si a no tiene éxito. No hay necesidad de más reglas o explicación, en mi humilde opinión.

    
respondido por el ignis 20.08.2013 - 23:05

Lea otras preguntas en las etiquetas