cleanup() { pkill -P $$ || true wait || true } trap_add() { trap_add_cmd=$1; shift || fatal "${FUNCNAME} usage error" for trap_add_name in "$@"; do trap -- "$( extract_trap_cmd() { printf '%s\n' "${3:-}"; } eval "extract_trap_cmd $(trap -p "${trap_add_name}")" printf '%s\n' "${trap_add_cmd}" )" "${trap_add_name}" \ || fatal "unable to add to trap ${trap_add_name}" done } declare -f -t trap_add trap_add 'cleanup' EXIT