陷入 bash 陷阱(RETURN 陷阱)

陷入 bash 陷阱(RETURN 陷阱)

我正在寻找一种惯用的模式来使用陷阱作为“确保”或“最终”的含义,因此无论 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}会导致陷阱恢复到默认值;我想在这种情况下,默认值是“阴影”陷阱命令。

答案2

正确,RETURN 信号是 shell 全局的,就像所有信号一样。捕获任何信号取代已经在该信号上设置的任何陷阱,这可能就是您所说的“阴影”的意思。

陷阱提供了一些简单的异常处理,但对于更强大的东西,我会检查这个 stackoverflow 问题的答案试着抓

相关内容