Estoy usando las siguientes opciones
set -o pipefail
set -e
En script bash para detener la ejecución por error. Tengo ~ 100 líneas de ejecución de script y no quiero verificar el código de retorno de cada línea en el script.
Pero para un comando en particular, quiero ignorar el error. ¿Cómo puedo hacer eso?
-e
se establece el atributo "si el comando que falla es parte de la lista de comandos inmediatamente después de una palabra clavewhile
ountil
, parte de la prueba en unaif
declaración, parte de cualquier comando ejecutado "en una lista&&
o||
excepto el comando que sigue al final&&
o||
, cualquier comando en una tubería pero el último, o si el estado de retorno del comando se está invirtiendo!
".(ldd $2/bin/* || true) | grep "not found" | wc -l
script termina después de esta línea cuando ldd devuelve el error(ldd $2/bin/* || true) | grep "not found" | wc -l || true
set -o pipefail
. cuandogrep
no encuentra nada, devuelve un código de salida distinto de cero y es suficiente para que Shell piense que toda la tubería tiene un código de salida distinto de cero.Simplemente agregue
|| true
después del comando donde desea ignorar el error.fuente
set -e
e intenta capturar un mensaje de error: por ejemploset -e; TEST=$(foo 2>&1 || true); echo $TEST
No pare y también guarde el estado de salida
En caso de que si desea que su script no se detenga si falla un comando en particular y también desea guardar el código de error del comando fallido:
fuente
command
fue exitoso y es necesario ejecutar lo que sigue||
. léelo como: sicommand
falla, hazloEXIT_CODE=$?
. Probablemente podría hacercommand || echo "$?"
o usar "trap" para una depuración más detallada. Vea esto -> stackoverflow.com/a/6110446/10737630Más concisamente:
De la especificación POSIX con respecto
set -e
(énfasis mío):fuente
-e
.!
evitará que el shell salga sin importar qué. Este script muestra el mensajeStill alive!
cuando lo ejecuto, indicando que el script se ejecutó hasta su finalización. ¿Estás viendo un comportamiento diferente?if
cláusula y resolví el problema.En lugar de "devolver verdadero", también puede usar la utilidad "noop" o nula (como se menciona en las especificaciones POSIX )
:
y simplemente "no hacer nada". Ahorrarás algunas cartas. :)fuente
Si desea evitar que su script falle y recopile el código de retorno:
returncode
se recopila sin importar si el comando tiene éxito o falla.fuente
He estado usando el fragmento a continuación cuando trabajo con herramientas de CLI y quiero saber si existe algún recurso o no, pero no me importa el resultado.
fuente
if [ -r not_exist ]
Me gusta esta solución:
El comando / script entre los ticks posteriores se ejecuta y su salida se alimenta al comando ":" (que es el equivalente de "verdadero")
editar: Corregido error feo
fuente
mientras que
|| true
se prefiere uno, pero también puedes hacerfuente
No hay soluciones que funcionen para mí desde aquí, así que encontré otra:
Esto es útil para CI y CD. De esta forma, se imprimen los mensajes de error pero todo el script continúa ejecutándose.
fuente
Ejemplo de uso de esto para crear un archivo de registro
fuente
Gracias por la solución simple aquí desde arriba:
La siguiente construcción podría usarse para acciones adicionales / resolución de problemas de pasos de guión y opciones adicionales de control de flujo:
Podemos frenar las acciones adicionales y
exit 1
si es necesario.fuente