¿Cuál es la diferencia entre && y; cuando bifurca el sueño al fondo?

8

Acabo de hacer una pregunta sobre cómo bifurcar un proceso para dormir en el fondo.
La notación que se me ocurrió se ve así:

sleep 10 && echo "hello world" &

Esta respuesta a una pregunta diferente usa un formato diferente.

( sleep 10 ; echo "hello world" ) &

Sé que &&solo permite que el segundo proceso se inicie si el primero devuelve verdadero. ¿Puede fallar el sueño? ¿Hay alguna situación en la que prefiera uno sobre el otro?

Baarn
fuente

Respuestas:

12

El sueño puede fallar si se termina durante la ejecución:

$ sleep 2
$ echo "$?"
0
$ sleep 2
^C
$ echo "$?"
130

Dado que sleep es un ejecutable externo, también es concebible que las llamadas fork o exec puedan fallar, lo que también provocaría que bash genere un código de error> 0.

Chris Down
fuente
5

a; bsiempre ejecuta el segundo comando después del primero, mientras que a && bejecuta el segundo comando solo si el primero tiene éxito, es decir, solo si el primer comando devuelve el estado 0.

sleepsiempre devuelve el estado 0, excepto cuando es eliminado por una señal, en cuyo caso el estado es 128 + número de señal. (El estado también puede ser 126 o 127 si el sleepcomando no existe o si el programa no puede iniciarse debido a la falta de recursos, pero es muy poco probable que encuentre estos casos).

Por lo tanto, debe usar ;o, &&según lo que quiera que suceda, si se interrumpe el sueño:

  • sleep 10; echo helloimprime el mensaje después de 10 segundos (menos si sleepuna señal lo mata);
  • sleep 10 && echo helloimprime el mensaje después de 10 segundos, pero no imprime nada si sleepuna señal lo mata.
Gilles 'SO- deja de ser malvado'
fuente
3

Debe suponer que cualquier comando puede fallar por varias razones, incluso si es muy poco probable que falle el sueño.

( sleep 10 ; echo "hello world" ) &

significa dormir en segundo plano y ejecutar el eco después del proceso de dormir, pero si el sueño falla, el eco se ejecutará de todos modos, vea la explicación completa

sleep 10 && echo "hello world" &

significa que debe esperar el final de la suspensión antes de hacer eco de cualquier cosa y, si el eco falla, el proceso se detiene pero todo el comando también está en segundo plano. ver explicación completa

Conclusión,
la primera sintaxis es el script de shell, lo que significa que está considerando las instrucciones por separado como una lista.
La segunda opción usa && significa Y, por lo tanto, si la usa si el primer comando falla, el segundo no se ejecutará.

Este es solo un comportamiento diferente en el manejo de errores.

Kiwy
fuente
@terdon Gracias por la edición, mi publicación fue realmente terriblemente escrita
Kiwy