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 deshabilitar 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 )?
Una alternativa para cancelar la fianza por error sería forzar un éxito sin importar qué. Puedes hacer algo como esto:
Eso devolverá 0 (verdadero), por lo que el conjunto -e no debe activarse
fuente
faulty_cmd || :
Es otro idioma popular para esto. (El:
es un comando sinónimo detrue
).Si está tratando de atrapar el código de retorno / error (función o bifurcación), esto funciona:
fuente
Si se aplica o se ignora la "opción de shell de salida inmediata", depende del contexto del comando ejecutado (consulte la sección Manual de referencia de Bash en Set Builtin , gracias a Arkadiusz Drabczyk).
Especialmente, la opción se ignora si un comando es parte de la prueba en una declaración if. Por lo tanto, es posible ejecutar un comando y verificar su éxito o falla dentro de un "contexto inmediato de salida" usando una instrucción if como esta:
Es posible omitir la declaración "entonces" y usar menos líneas:
fuente
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:
Aunque
-e
específicamente, las opciones que otros han mencionado (|| true
o "puesto dentro de unif
") pueden ser más idiomáticas.fuente
En realidad, tuve una pregunta similar recientemente (aunque no publiqué, me di cuenta), y, por lo que puedo ver, parece que solo uso set + e antes del comando y set -e después funciona de manera más elegante. Aquí hay un ejemplo, agarrando la respuesta del comando y no dejando que el error lo descarte.
Esto toma la salida de 'fortuna', verifica su estado de salida, y hace eco y lo dice. Creo que esto es lo que estabas pidiendo, o al menos algo similar. De todos modos, espero que esto ayude.
fuente
Me gusta iniciar subshell si quiero cambiar algo temporalmente. El siguiente comando demuestra que el primer bad_command se ignora y el segundo aborta la ejecución.
fuente