Introducción
Podemos usar el comando trap
para capturar las señales de error del sistema mientras se ejecuta el script. Luego puede ejecutar un comando de shell o llamar a una función. De esta forma, puede ejecutar su propio código de secuencia de comandos personalizado en un error que se produjo en una secuencia de comandos bash.
Esto puede ser útil para revertir cambios parciales, cerrar conexiones de bases de datos o enviar correos electrónicos a las personas afectadas, etc. Puede usar el comando trap con la señal ERR como:
trap 'on_error_function' ERR
Cuando se produce un error en un script de shell, ejecutará una función llamada ' on_error_function
' del script de shell. En lugar de llamar a una función, también puede simplemente ejecutar un comando.
Ejemplo: Cómo ejecutar una función en Error en Bash
Entendamos con un ejemplo. Cree un script de shell de ejemplo y cree una función con cualquier nombre. Luego agregue el comando trap
con la función para la señal ERR. Luego, agregue un comando simple que arroje un error:
#!/usr/bin/env bash
on_error(){
echo "Some error occurred"
}
trap 'on_error' ERR
ls ~/dir_not_exists
Ejecute el script anterior y debería ver los resultados a continuación:
ls: cannot access '/home/noviello/dir_not_exists': No such file or directory
Some error occurred
Puede ver que el error está atrapado y el script bash ejecuta la función on_error()
.
Ejemplo: Cómo ejecutar un comando en Error en Bash
Veamos otro ejemplo. Aquí ejecutaremos un comando cuando ocurra un error en el script de shell:
#!/usr/bin/env bash
trap 'echo Ohhh no!' ERR
ls ~/dir_not_exists
En el script anterior, no definimos ninguna función separada. Simplemente ejecute un comando de eco en caso de error. Ejecute el script anterior y vea los resultados:
ls: cannot access '/home/noviello/dir_not_exists': No such file or directory
Ohhh no!
Ejemplo: Cómo obtener el número de línea del error que ocurrió
También puede encontrar el número de línea, donde ocurrió el error en el script bash junto con el nombre del script. Para hacer esto, use el "llamador" incorporado en bash:
#!/usr/bin/env bash
on_error(){
echo "Error found in: $(caller)" >&2
}
trap 'on_error' ERR
ls ~/dir_not_exists
Ejecute el script anterior y vea los resultados. Verá el nombre del script y el número de línea, donde ocurrió el error.
ls: cannot access '/home/noviello/dir_not_exists': No such file or directory
Error found in: 9./script.sh
Conclusión
Gracias por leer este artículo. Con suerte, este tutorial lo ayudará a escribir mejor los scripts de shell al detectar el error y tomar alguna acción.
Además, recuerda que la trampa ERR solo detecta errores en tiempo de ejecución. Como si cualquier comando devolviera el código de estado distinto de cero. No detecta errores de sintaxis, porque en caso de error de sintaxis, el script falla sin ejecutar ningún comando.