2012-02-10 14 views
6

Tengo un montón de código de limpieza genérico que debe hacerse cada vez que sale cierto script bash, ya sea que salió normalmente o se interrumpió. Pensé que usaría la pseudosignal trap "..." EXIT para lograr esto.Captura de señal bash no detecta las variables modificadas después de la declaración del bloque 'trap'

Además de la limpieza genérica, también hay una pieza de limpieza específica que solo debe realizarse si la secuencia de comandos se completa normalmente. Pensé que podría desencadenar esto haciendo que el bloque 'trampa' probar una variable, así:

#!/bin/bash 
done=false; 
trap "{   
      #generic cleanup code goes here. 
      if $done 
      then 
       #cleanup to be done only on completion goes here. 
       echo Test; 
      fi 
     }" EXIT 
#main script goes here 
done=true; 

Sin embargo, esto no funciona. Ejecutando el siguiente código nunca se repetirá "Test". Agregar una llamada exit explícita después de done=true; no cambia nada. ¿Qué me estoy perdiendo?

¡Salud!

Respuesta

13

La trampa se está interpolando y está utilizando el valor de $ done en el momento en que se está definiendo la trampa en lugar de cuando se ejecuta. Puede usar comillas simples alrededor de la definición de trampa o definir una función. La definición de una función es probablemente más limpio:

 
#!/bin/sh 
done=false 
cleanup() { if $done; then echo Test; fi; } 
trap cleanup EXIT 
done=true 

Esto funciona porque la expansión de variables en la función se difiere hasta que la función se llama, en lugar de cuando se define la función.

Cuestiones relacionadas