Advertisement
s243a

trap_stack.sh

Apr 5th, 2019
290
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 1.55 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.   for sig in $sigs; do
  32.     local stack_name=`trap_stack_name "$sig"`
  33.     local count; eval 'count=${#'"${stack_name}"'[@]}'
  34.     [[ $count -lt 1 ]] && return 127
  35.     local new_trap
  36.     local ref="${stack_name}"'[${#'"${stack_name}"'[@]}-1]'
  37.     local cmd='new_trap=${'"$ref}"; eval $cmd
  38.     trap "${new_trap}" "$sig"
  39.     eval "unset $ref"
  40.   done
  41. }
  42.  
  43. trap_prepend() {
  44.   local new_trap=$1
  45.   shift
  46.   local sigs=$*
  47.   for sig in $sigs; do
  48.     if [[ -z $(get_trap $sig) ]]; then
  49.       trap_push "$new_trap" "$sig"
  50.     else
  51.       trap_push "$new_trap ; $(get_trap $sig)" "$sig"
  52.     fi
  53.   done
  54. }
  55.  
  56. trap_append() {
  57.   local new_trap=$1
  58.   shift
  59.   local sigs=$*
  60.   for sig in $sigs; do
  61.     if [[ -z $(get_trap $sig) ]]; then
  62.       trap_push "$new_trap" "$sig"
  63.     else
  64.       trap_push "$(get_trap $sig) ; $new_trap" "$sig"
  65.     fi
  66.   done
  67. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement