+++ /dev/null
-#!/bin/bash
-
-# a framework for stacking EXIT traps
-# this could, should be further enhanced to allow stacks of traps for various
-# exits. but right now it's hard-coded for EXIT traps
-
-exit_actions=()
-
-push_exit_trap() {
- local action="$1"
- local trap_handle="$2"
-
- local var="exit_trap_handle_$trap_handle"
-
- if [ -n "${!var}" ]; then
- echo "fail! trap handle $trap_handle is already in use"
- return 1
- fi
-
- local num_items=${#exit_actions[@]}
- exit_actions[$num_items]="$action"
- eval $var="$num_items"
-
- return 0
-
-}
-
-delete_exit_trap() {
- local trap_handles="$@"
-
- local handle
- for handle in $trap_handles; do
- local var="exit_trap_handle_$handle"
- local trap_num=${!var}
- exit_actions[$trap_num]=""
- eval unset $var
- done
-}
-
-print_exit_traps() {
-
- local i num_items=${#exit_actions[@]}
- for i in $(seq 0 $((num_items-1))); do
- if [ -z "${exit_actions[$i]}" ]; then
- continue
- fi
- echo "${exit_actions[$i]}"
- done
-
-}
-
-run_exit_traps() {
-
- local i num_items=${#exit_actions[@]}
- for i in $(seq $((num_items-1)) -1 0); do
- if [ -z "${exit_actions[$i]}" ]; then
- continue
- fi
- eval ${exit_actions[$i]}
- done
-
-}
-
-trap run_exit_traps EXIT
-
-if [ "$1" = "unit_test" ]; then
- if ! push_exit_trap "echo \"this is the first trap\"" "a"; then
- echo "failed to install trap 1"
- exit 1
- fi
- if ! push_exit_trap "echo \"this is the second trap\"" "b"; then
- echo "failed to install trap 2"
- exit 2
- fi
- delete_exit_trap "b"
- if ! push_exit_trap "echo \"this is the third trap\"" "b"; then
- echo "failed to install trap 3"
- exit 3
- fi
-
- # to see the traps
- print_exit_traps
- echo "------------"
-
- delete_exit_trap "a" "b"
- print_exit_traps
- echo "------------"
-
- if ! push_exit_trap "echo \"this is the first trap\"" "a"; then
- echo "failed to install trap 1"
- exit 1
- fi
- if ! push_exit_trap "echo \"this is the second trap\"" "b"; then
- echo "failed to install trap 2"
- exit 2
- fi
- if ! push_exit_trap "echo \"this is the third trap\"" "c"; then
- echo "failed to install trap 3"
- exit 3
- fi
- delete_exit_trap "a" "c"
-
- print_exit_traps
- echo "------------"
-fi