使用RETURN陷阱进行bash清理并立即重置处理程序

时间:2018-10-16 18:19:33

标签: bash bash-trap

是否可以在陷阱处理程序中禁用陷阱?

我想通过使用RETURN陷阱来简化一些代码。 my_func将返回my_command的值。当my_func返回时,tmpfile将被清除。这种技术将使我避免分配临时变量来保存$?进行清理时从my_func中访问。

但是,我无法在处理程序中重置陷阱处理程序,并且每次函数返回后都会调用清除操作。

最终,我真正想做的是在调用my_command之后进行清理,但仍将其作为最后一个命令,因此返回值是隐式的。任何建议的替代方案将不胜感激。

cleanup() { # generic cleanup w/ reset
   "$@"
   trap - RETURN
}

my_func() {
   local -r tmpfile="/tmp/tmpfile"
   trap "cleanup rm ${tmpfile}" RETURN
   my_command -f ${tmpfile}
}

caller() {
   if my_func ; then
      do_success_ops
   fi
}

1 个答案:

答案 0 :(得分:1)

我总是使用这种模式:

trap 'rm -rf "$workspace"' EXIT
workspace="$(mktemp --directory)" # Or -d
# Use $workspace

这有几个不错的功能:

  1. 在创建目录之前 设置了陷阱,因此没有争用条件。
  2. 创建目录意味着不需要在脚本中进行任何mktemp调用,因为我可以将所有内容都放在该目录中。
  3. 创建目录而不是文件可以提供更好的安全性基准,因为通常每个人都可以看到/tmp中直接包含的内容,但是新目录将归您所有,并创建为“ u + rwx,减去umask限制”(来自man mktemp)。

如果您想清理更早,我建议您明确地进行清理。您的解决方案具有两个不必要的间接级别:陷阱和要运行的参数传递。