I'm not sure if it is robust to concatenating the trap strings by a
newline. When one of the registered trap strings contains a syntax
error, it would affect the subsequent commands. When one of the trap
strings contains the builtin changing the control flow, such as
`return', `break', and `continue`, subsequent registered trap strings
would be skipped. I think the proper implementation should manage an
array for each signal, which is separate from the store managed by the
trap builtin.
Something like
trap_store=()
trap_eval() { for ((i=0;i<${#trap_store[@]};i+=2)); do [[ "${trap_store[i+1]}" == "$1" ]]
&& (eval "${trap_store[i]}"); done; }
trap () { local CMD="$1"; shift; while (($#>0)); do trap_store+=("$CMD" "$1"); builtin trap
"trap_eval $1" "$1"; shift; done; }
?