
El comando set -e hace que un script bash falle inmediatamente cuando cualquier comando devuelve un código de salida distinto de cero.
¿Existe una manera fácil y elegante de desactivar este comportamiento para un comando individual dentro de un script?
¿En qué lugares está documentada esta funcionalidad en el Manual de referencia de Bash (http://www.gnu.org/software/bash/manual/bashref.html)?
Respuesta1
Algo como esto:
#!/usr/bin/env bash set -e echo hi # disable exitting on error temporarily set +e aoeuidhtn echo next line # bring it back set -e ao echo next line
Correr:
$ ./test.sh hi ./test.sh: line 7: aoeuidhtn: command not found next line ./test.sh: line 11: ao: command not found
Se describe en
set
la ayuda incorporada:$ type set set is a shell builtin $ help set (...) Using + rather than - causes these flags to be turned off.
Lo mismo está documentado aquí:https://www.gnu.org/software/bash/manual/bashref.html#The-Set-Builtin.
Respuesta2
Una alternativa a anular la fianza por error sería forzar el éxito pase lo que pase. Puedes hacer algo como esto:
cmd_to_run || true
Eso devolverá 0 (verdadero), por lo que el conjunto -e no debería activarse
Respuesta3
Si está intentando capturar el código de retorno/error (función o bifurcación), esto funciona:
function xyz {
return 2
}
xyz && RC=$? || RC=$?
Respuesta4
Otro enfoque, que encuentro bastante sencillo (y se aplica a otras set
opciones además de -e
):
Utilice $-
para restaurar la configuración.
Por ejemplo:
oldopt=$-
set +e
# now '-e' is definitely disabled.
# do some stuff...
# Restore things back to how they were
set -$oldopt
Aunque -e
específicamente, las opciones que otros han mencionado ( || true
o "poner dentro de if
") pueden ser más idiomáticas.