我正在寻找一种惯用的模式来使用陷阱作为“确保”或“最终”的含义,因此无论 bash 函数如何退出,它们都应该执行。
我已经找到了RETURN
陷阱,但嵌套并不是小事。我猜想 bar 内的陷阱会遮蔽 foo 中的陷阱。我怎样才能为foo
两者设置陷阱bar
因此,鉴于以下代码,我希望在退出foo
和退出时进行清理bar
。
我的第一次尝试是使用一个全局字符串来存储清理任务,但是只要有子 shell,该字符串就会中断。从以下代码的输出看来,RETURN 信号也是“shell-global”
fooclear() { echo fooclear; }
barclear() { echo barclear; }
bar() {
echo bar
trap barclear RETURN INT ERR TERM EXIT
sleep 1
}
foo() {
echo foo
sleep 1
trap fooclear RETURN INT ERR TERM EXIT
bar
}
for i in 1 2 3; do
foo &
done
wait
还有一个警告:为了避免重复处理,必须以某种方式管理清算功能已经完成。
答案1
我在任何地方都找不到这个记录,但似乎添加了:
trap - RETURN
作为陷阱处理程序中的最后一个命令,导致陷阱恢复到前一个命令(在某处bash
保留一堆RETURN
处理程序。文档说,通常trap - {SIGSPEC}
会导致陷阱恢复到默认值;我想在这种情况下,默认值是“阴影”陷阱命令。