trapadd () { _trapadd_is_bash() { [[ $BASH = */bash ]]; } typeset _trapadd_action="$1" if _trapadd_is_bash; then _trapadd_signal=$(echo $2 | tr 'a-z' 'A-Z') else typeset -u _trapadd_signal="$2" fi typeset _trapadd_position="$3" typeset _trapadd_trapout="$4" typeset _trapadd_cur_trap=/tmp/$$.$RANDOM typeset _trapadd_line="" typeset _trapadd_abba="" trap -p > $_trapadd_cur_trap exec 9< $_trapadd_cur_trap rm $_trapadd_cur_trap while read -u9 -r -- _trapadd_line; do [[ "$_trapadd_line" = *?(SIG)$_trapadd_signal ]] || continue if [[ $_trapadd_position = "prepend" ]]; then _trapadd_line=${_trapadd_line#*\'} _trapadd_line="trap '$_trapadd_action; $_trapadd_line" else _trapadd_line=${_trapadd_line%%?(;)*([[:space:]])\'+([!\'])} _trapadd_line="$_trapadd_line; $_trapadd_action' $_trapadd_signal" fi break done exec 9>&- [[ -z "$_trapadd_line" ]] && { _trapadd_line="trap '$_trapadd_action' $_trapadd_signal" } _trapadd_abba=$(t() { trap 'printf "%s" a' EXIT; }; t; printf "%s" b) if [[ -n $_trapadd_trapout ]] then printf "%s\n" "$_trapadd_line" else if [[ $_trapadd_abba = "ab" ]] then trap "eval \"$_trapadd_line\"" EXIT else eval "$_trapadd_line" fi fi }