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