Let me update the example implementation of ``defer''. I think this is more readable:
function defer { local trap eval "trap=($(trap -p RETURN))" trap -- " if [[ \$FUNCNAME != defer ]]; then trap - RETURN $1 ${trap[2]-} fi" RETURN } declare -ft defer I also tested it with an example to demonstrate the behavior: function f1 { echo allocA defer 'echo freeA' echo allocB defer 'echo freeB' f2 f2 } function f2 { echo f2 echo allocC defer 'echo freeC' echo allocD defer 'echo freeD' } f1 ---------- result ---------- allocA allocB f2 allocC allocD freeD freeC f2 allocC allocD freeD freeC freeB freeA -- Koichi