2010-02-01 15 views
21

Duplicar posibles:
Identifying received signal name in bash shell script¿Es posible detectar * qué * señal de trampa en bash?

Al utilizar algo así como trap func_trap INT TERM EXIT con:

func_trap() { 
    ...some commands... 
} 

¿Hay alguna manera en el bloque de función para detectar cuales trampa lo ha llamado?

Algo así como:

func_trap() { 
    if signal = INT; then 
     # do this 
    else 
     # do that 
    fi 
} 

¿O tengo que escribir una función separada para cada tipo de trampa que hace algo diferente? ¿Hay una variable bash que contenga la última señal recibida?

¡Gracias de antemano!

Respuesta

5

No hay indicaciones de documentación de ningún argumento o variable que contenga la señal atrapada, por lo que tendrá que escribir una declaración de función/captura para cada trampa que desee que se comporte de manera diferente.

+0

gracias. eso me ahorra cavar aún más. – Wolf

63

puede implementar su propia función trampa que pasa automáticamente la señal con la función:

trap_with_arg() { 
    func="$1" ; shift 
    for sig ; do 
     trap "$func $sig" "$sig" 
    done 
} 

$ trap_with_arg func_trap INT TERM EXIT 

El primer argumento de func_trap será el nombre de la señal.

+4

+9000: Estás usando [currying] (http://en.wikipedia.org/wiki/Currying) en Bash. Brillante. – kevinarpe

+2

Puede ser más claro escribir: 'para sig" $ @ "; do' – kevinarpe

+1

@kevinarpe: Eso tendría que ser 'para sig en" $ @ "; do' - posiblemente más claro, pero 'para var; do' es un modismo bastante común (para mí), que está igual de claro. También evita la trampa de usar '$ @' o '$ *' en lugar de '" $ @ "' que muchas personas caen en. – camh

Cuestiones relacionadas