arrays - Bash: Save and restore trap state? Easy way to manage multiple handlers for traps? -


what way override bash trap handlers don't permanently trample existing ones may or may not set? dynamically managing arbitrary chains of trap routines?

is there way save current state of trap handlers can restored later?

save , restore trap handler state in bash

i submit following stack implementation track , restore trap state. using method, able push trap changes , pop them away when i'm done them. used chain many trap routines together.

see following source file (.trap_stack.sh)

#!/bin/bash trap_stack_name() {   local sig=${1//[^a-za-z0-9]/_}   echo "__trap_stack_$sig" }  extract_trap() {   echo ${@:3:$(($#-3))} }  get_trap() {   eval echo $(extract_trap `trap -p $1`) }  trap_push() {   local new_trap=$1   shift   local sigs=$*   sig in $sigs;     local stack_name=`trap_stack_name "$sig"`     local old_trap=$(get_trap $sig)     eval "${stack_name}"'[${#'"${stack_name}"'[@]}]=$old_trap'     trap "${new_trap}" "$sig"   done }  trap_pop() {   local sigs=$*   sig in $sigs;     local stack_name=`trap_stack_name "$sig"`     local count; eval 'count=${#'"${stack_name}"'[@]}'     [[ $count -lt 1 ]] && return 127     local new_trap     local ref="${stack_name}"'[${#'"${stack_name}"'[@]}-1]'     local cmd='new_trap=${'"$ref}"; eval $cmd     trap "${new_trap}" "$sig"     eval "unset $ref"   done }  trap_prepend() {   local new_trap=$1   shift   local sigs=$*   sig in $sigs;     if [[ -z $(get_trap $sig) ]];       trap_push "$new_trap" "$sig"     else       trap_push "$new_trap ; $(get_trap $sig)" "$sig"     fi   done }  trap_append() {   local new_trap=$1   shift   local sigs=$*   sig in $sigs;     if [[ -z $(get_trap $sig) ]];       trap_push "$new_trap" "$sig"     else       trap_push "$(get_trap $sig) ; $new_trap" "$sig"     fi   done } 

this can manage handlers defined named functions , ad-hoc routines defined example trap "kill $!" sigterm sigint.

this test script used me write it:

#!/bin/bash source .trap_stack.sh  initial_trap='echo "messy" ;'" echo 'handler'" non_f_trap='echo "non-function trap"' f_trap() {   echo "function trap" }  print_status() {   echo "    sigint  trap: `get_trap sigint`"     echo "    sigterm trap: `get_trap sigterm`"   echo "-------------"   echo }  echo "--- test start ---" echo "initial trap state (should empty):" print_status  echo 'setting messy non-function handler sigint ("original state")' trap "$initial_trap" sigint print_status  echo 'pop empty stacks (still in original state)' trap_pop sigint sigterm print_status  echo 'push non-function handler sigint' trap_push "$non_f_trap" sigint print_status  echo 'append function handler sigint , sigterm' trap_append f_trap sigint sigterm print_status  echo 'prepend function handler sigint , sigterm' trap_prepend f_trap sigint sigterm print_status  echo 'push non-function handler sigint , sigterm' trap_push "$non_f_trap" sigint sigterm print_status  echo 'pop both stacks' trap_pop sigint sigterm print_status  echo 'prepend function handler sigint , sigterm' trap_prepend f_trap sigint sigterm print_status  echo 'pop both stacks thrice' trap_pop sigint sigterm trap_pop sigint sigterm trap_pop sigint sigterm print_status  echo 'push non-function handler sigterm' trap_push "$non_f_trap" sigterm print_status  echo 'pop handler state sigint (sigint original state)' trap_pop sigint print_status  echo 'pop handler state sigterm (sigterm original state)' trap_pop sigterm print_status 

Comments

Popular posts from this blog

c# - Send Image in Json : 400 Bad request -

jquery - Fancybox - apply a function to several elements -

An easy way to program an Android keyboard layout app -