lenguaje - ¿Cómo evitar que un script de bash falle cuando la opción-e está configurada?
shell script linux (3)
Otra opción es usar la trap
para capturar la señal de EXIT
:
trap ''echo "ls failed" ; some_rescue_action'' EXIT
ls /non_exist
Tengo un script bash con el conjunto de opciones -e
, que falla todo el script en el primer error.
En el script, estoy tratando de hacer un ls
en un directorio. Pero ese camino puede o no existir. Si la ruta no existe, el comando ls
falla, ya que el indicador -e
está establecido.
¿Hay alguna manera de evitar que el script falle?
Como nota al margen, he intentado el truco para hacer un set +e
y set -e
antes y después de ese comando y funciona. Pero estoy buscando alguna solución mejor.
Puedes "atrapar" el error usando ||
y un comando garantizado para salir con 0 estados:
ls $PATH || echo "$PATH does not exist"
Dado que el comando compuesto tiene éxito ya sea que exista o no $PATH
, set -e
no se activa y su script no se cerrará.
Para suprimir el error de forma silenciosa, puede usar el comando true
:
ls $PATH || true
Para ejecutar varios comandos, puede usar uno de los comandos compuestos:
ls $PATH || { command1; command2; }
o
ls $PATH || ( command1; command2 )
Solo asegúrate de que nada falla dentro de cualquiera de los comandos compuestos, tampoco. Una de las ventajas del segundo ejemplo es que puede desactivar el modo de salida inmediata dentro de la subshell sin afectar su estado en la shell actual:
ls $PATH || ( set +e; do-something-that-might-fail )
Una solución sería probar la existencia de la carpeta.
function myLs() {
LIST=""
folder=$1
[ "x$folder" = "x" ] && folder="."
[ -d $folder ] && LIST=`ls $folder`
echo $LIST
}
De esta manera, bash no fallará si la $folder
no existe.