linux - editar - ¿Cómo salir si falla un comando?
linux easytag (9)
El shell integrado trap
permite señales de captura y otras condiciones útiles, incluida la ejecución de comandos fallidos (es decir, un estado de devolución distinto de cero). Por lo tanto, si no desea probar explícitamente el estado de devolución de cada comando, puede decir trap "your shell code" ERR
y el código del shell se ejecutará cada vez que un comando devuelva un estado distinto de cero. Por ejemplo:
trap "echo script failed; exit 1" ERR
Tenga en cuenta que, al igual que en otros casos de captura de comandos fallidos, las tuberías necesitan un tratamiento especial; lo anterior no captará false | true
false | true
Soy un novato en shell-scripting. Quiero imprimir un mensaje y salir de mi script si falla un comando. He intentado:
my_command && (echo ''my_command failed; exit)
Pero no funciona. Sigue ejecutando las instrucciones que siguen a esta línea en el script. Estoy usando Ubuntu y bash.
He pirateado el siguiente modismo:
echo "Generating from IDL..."
idlj -fclient -td java/src echo.idl
if [ $? -ne 0 ]; then { echo "Failed, aborting." ; exit 1; } fi
echo "Compiling classes..."
javac *java
if [ $? -ne 0 ]; then { echo "Failed, aborting." ; exit 1; } fi
echo "Done."
Preceda cada comando con un eco informativo, y siga cada comando con ese mismo
if [ $? -ne 0 ];...
if [ $? -ne 0 ];...
línea. (Por supuesto, puede editar ese mensaje de error si lo desea).
Las otras respuestas han cubierto bien la pregunta directa, pero también puede interesarle usar set -e
. Con eso, cualquier comando que falle (fuera de contextos específicos como if
tests) hará que la secuencia de comandos aborte. Para ciertos guiones, es muy útil.
Para corregir errores en tus comandos:
execute [INVOKING-FUNCTION] [COMMAND]
execute () {
error=$($2 2>&1 >/dev/null)
if [ $? -ne 0 ]; then
echo "$1: $error"
exit 1
fi
}
Inspirado en la fabricación ajustada:
Si quieres ese comportamiento para todos los comandos en tu script, simplemente agrega
set -e
set -o pipefail
al comienzo del guion. Este par de opciones le dice al intérprete bash que salga cada vez que un comando retorna con un código de salida distinto de cero.
Sin embargo, esto no le permite imprimir un mensaje de salida.
Siempre que my_command
esté diseñado canónicamente, es decir , devuelve 0 cuando tiene éxito, entonces &&
es exactamente lo contrario de lo que desea. Tu quieres ||
.
También tenga en cuenta que (
no me parece correcto en bash, pero no puedo intentarlo desde donde estoy. Dígame.
my_command || {
echo ''my_command failed'' ;
exit 1;
}
También puede usar, si desea conservar el estado de error de salida, y tener un archivo legible con un comando por línea:
my_command1 || exit $?
my_command2 || exit $?
Esto, sin embargo, no imprimirá ningún mensaje de error adicional. Pero en algunos casos, el error se imprimirá por el comando fallido de todos modos.
Tenga en cuenta también que el estado de salida de cada comando se almacena en la variable de shell $ ?, que puede verificar inmediatamente después de ejecutar el comando. Un estado distinto de cero indica falla:
my_command
if [ $? -eq 0 ]
then
echo "it worked"
else
echo "it failed"
fi
Tratar:
my_command || { echo ''my_command failed'' ; exit 1; }
Cuatro cambios:
- Cambiar
&&
a||
- Usa
{ }
en lugar de( )
- Presentar
;
después de laexit
y - espacios después de
{
y antes}
Como desea imprimir el mensaje y salir solo cuando el comando falla (sale con un valor distinto de cero) necesita un ||
no es un &&
.
cmd1 && cmd2
ejecutará cmd2
cuando cmd1
(valor de salida 0
). Donde como
cmd1 || cmd2
ejecutará cmd2
cuando falle cmd1
(valor de salida distinto de cero).
El uso ( )
hace que el comando dentro de ellos se ejecute en un subconjunto y llamar a una exit
desde allí hace que salga del subconjunto y no del intérprete de comandos original, por lo tanto, la ejecución continúa en el intérprete de comandos original.
Para superar este uso { }
Los últimos dos cambios son requeridos por bash.