2012-09-20 6 views
22

Tengo un script bash con el conjunto de opciones -e, que falla todo el script en el primer error.Cómo evitar que una secuencia de comandos bash falle cuando se establece la opción -e?

En el script, intento hacer un ls en un directorio. Pero ese camino puede o no existir. Si la ruta de acceso no existe, el comando ls falla, ya que se establece el indicador -e.

¿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 una mejor solución.

Respuesta

30

Usted puede "atrapar" el error utilizando || y una orden garantizada para salir con el estado 0:

ls $PATH || echo "$PATH does not exist" 

Desde el comando compuesto tiene éxito o no existe $PATH, set -e no se activa y su script no se cerrará.

para suprimir el error de forma silenciosa, puede utilizar el comando true:

ls $PATH || true 

Para ejecutar varios comandos, puede utilizar uno de los compuestos comandos:

ls $PATH || { command1; command2; } 

o

ls $PATH || (command1; command2) 

Sólo asegúrese de que nada falla dentro de cualquiera de los comandos compuestos, tampoco. Uno de los beneficios del segundo ejemplo es que se puede desactivar el modo de salida inmediata dentro de la subcapa sin afectar a su estado en el shell actual:

ls $PATH || (set +e; do-something-that-might-fail) 
+0

Gracias por la respuesta. Todavía tengo un par de dudas. Si el comando 'ls' falla, aún se imprime un mensaje, que tal o cual camino existe, ¿hay alguna manera de suprimir eso? Además, en la parte 'OR', ¿hay alguna manera de ejecutar 2 líneas de código? – Bhushan

2

una solución podría estar probando la existencia de la carpeta

function myLs() { 
    LIST="" 
    folder=$1 
    [ "x$folder" = "x" ] && folder="." 
    [ -d $folder ] && LIST=`ls $folder` 
    echo $LIST 
} 

Esta fiesta de manera no fallará si no existe $folder

5

Otra opción es utilizar trap para captar la señal de EXIT:

trap 'echo "ls failed" ; some_rescue_action' EXIT 
ls /non_exist 
Cuestiones relacionadas