Advertisement
s243a

trap_stack.sh

Apr 13th, 2019
321
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 2.25 KB | None | 0 0
  1. #!/bin/bash
  2. #https://stackoverflow.com/questions/16115144/save-and-restore-trap-state-easy-way-to-manage-multiple-handlers-for-traps
  3. #https://stackoverflow.com/questions/3338030/multiple-bash-traps-for-the-same-signal
  4. trap_stack_name() {
  5.   local sig=${1//[^a-zA-Z0-9]/_}
  6.   echo "__trap_stack_$sig"
  7. }
  8.  
  9. extract_trap() {
  10.   echo ${@:3:$(($#-3))}
  11. }
  12.  
  13. get_trap() {
  14.   eval echo $(extract_trap `trap -p $1`)
  15. }
  16.  
  17. trap_push() {
  18.   local new_trap=$1
  19.   shift
  20.   local sigs=$*
  21.   for sig in $sigs; do
  22.     local stack_name=`trap_stack_name "$sig"`
  23.     local old_trap=$(get_trap $sig)
  24.     eval "${stack_name}"'[${#'"${stack_name}"'[@]}]=$old_trap'
  25.     trap "${new_trap}" "$sig"
  26.   done
  27. }
  28.  
  29. trap_pop() {
  30.   local sigs=$*
  31.   #Add
  32.   if [ -z "$sigs" ]; then #Avoids inifinite loops
  33.     #Untested. I think we can use numers instead of signal names
  34.     sigs="0 1 2 3 6 9 14 15"
  35.   fi
  36.   for sig in $sigs; do
  37.     local stack_name=`trap_stack_name "$sig"`
  38.     local count; eval 'count=${#'"${stack_name}"'[@]}'
  39.     [[ $count -lt 1 ]] && return 127
  40.     local new_trap
  41.     #local ref="${stack_name}"'[${#'"${stack_name}"'[@]}-1]'
  42.     local ref="${stack_name}"'['$(($count-1))']'
  43.     local cmd='new_trap=${'"$ref}"; eval $cmd
  44.     trap "${new_trap}" "$sig"
  45.     eval "unset $ref"
  46.   done
  47. }
  48.  
  49. trap_prepend() {
  50.   local new_trap=$1
  51.   shift
  52.   local sigs=$*
  53.   for sig in $sigs; do
  54.     if [[ -z $(get_trap $sig) ]]; then
  55.       trap_push "$new_trap" "$sig"
  56.     else
  57.       trap_push "$new_trap ; $(get_trap $sig)" "$sig"
  58.     fi
  59.   done
  60. }
  61.  
  62. trap_append() {
  63.   local new_trap=$1
  64.   shift
  65.   local sigs=$*
  66.   for sig in $sigs; do
  67.     if [[ -z $(get_trap $sig) ]]; then
  68.       trap_push "$new_trap" "$sig"
  69.     else
  70.       trap_push "$(get_trap $sig) ; $new_trap" "$sig"
  71.     fi
  72.   done
  73. }
  74. call_last_trap(){ #Function added by s243a
  75.   local sig=$1
  76.   trap_pop $sig
  77.   local curr_trap="$(get_trap $sig)"
  78.   eval $curr_trap
  79.   #read -p "Press enter to continue"
  80. }
  81. trap_push_append(){ #Function added by s243a
  82.   local new_trap=$1
  83.   shift
  84.   local sigs=$*
  85.   for sig in $sigs; do
  86.     local stack_name=`trap_stack_name "$sig"`
  87.     local old_trap=$(get_trap $sig)
  88.     eval "${stack_name}"'[${#'"${stack_name}"'[@]}]=$old_trap'
  89.     trap "${new_trap} ; call_last_trap $sig" "$sig"
  90.   done
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement