Bash: ejecuta command2 si command1 falla

43

Quiero hacer algo como esto:

if cmd1 && cmd2
echo success
else
echo epic fail
fi

¿Cómo debería hacerlo?

michelemarcon
fuente
1
Simplemente falta la palabra clave "then" antes del comando "echo success"
Glenn Jackman
10
Hmmm; su pseudocódigo parece hacer una pregunta diferente a la que en su título .....
mattdm
Buen recurso para algunas condiciones de salida de scripts de shell pixelbeat.org/programming/shell_script_mistakes.html
Flashman

Respuestas:

71

Estos deberían hacer lo que necesita:

cmd1 && cmd2 && echo success || echo epic fail

o

if cmd1 && cmd2; then
    echo success
else
    echo epic fail
fi
Petr Uzel
fuente
3
Esto funciona, pero estoy confundido por qué ||no mira la salida del primer echocomando.
mlissner
1
@mlissner, el if else espera salir de los códigos, 0 si el comando se lanzó y 1 si se produjo un error. No lea en la salida. Just try whoami && whoami && echo success || echo epic faily ahora whoami && whoareyou && echo success || echo epic fail. No puedo entender lo que quieres decir con "no mira la salida del primer comando de eco"
m3nda
@mlissner Creo que recibí tu pregunta, pero la respuesta es que el comando echo no fallará nunca. Es decir, su retorno será 0, es decir, verdadero. Entonces, la condición que realmente importa es solocmd1 && cmd2
Kazim Zaidi
22

Petr Uzel es perfecto pero también puedes jugar con los magic $ ?.

PS contiene el código de salida del último comando ejecutado, y si lo usa, puede escribir sus scripts de manera bastante flexible.

Esta pregunta toca un poco este tema, ¿La mejor práctica para usar $? en bash? .

cmd1 
if [ "$?" -eq "0" ]
then
  echo "ok"
else
  echo "Fail"
fi

Entonces también puede reaccionar a diferentes códigos de salida y hacer diferentes cosas si lo desea.

Johan
fuente
1
Mi empresa, PHP Experts, Inc., y yo deseamos agradecerles por ser la pieza integral de nuestro script de CI interno. ¡Gracias!
Theodore R. Smith
7

El pseudocódigo de la pregunta no corresponde al título de la pregunta.

Si alguien necesita saber realmente cómo ejecutar el comando 2 si el comando 1 falla, esta es una explicación simple:

  • cmd1 || cmd2: Esto se ejecutará cmd1y, en caso de falla, se ejecutarácmd2
  • cmd1 && cmd2: Esto se ejecutará cmd1y, en caso de éxito, se ejecutarácmd2
  • cmd1 ; cmd2: Esto se ejecutará cmd1, y luego se ejecutará cmd2, independientemente de la falla o el éxito de la ejecución cmd1.
Orlando Rivera Letelier
fuente