使用返回陷阱和立即重置处理程序进行bash清理

使用返回陷阱和立即重置处理程序进行bash清理,bash,bash-trap,Bash,Bash Trap,有没有办法在陷阱处理程序中禁用陷阱 我想通过使用返回陷阱简化一些代码。my_func将返回my_命令的值。当my_func返回时,TMP文件将被清理。这项技术允许我避免分配一个临时变量来保存$?当我做清理时,从我的函数 但是,我无法在处理程序中重置陷阱处理程序,现在在每个函数返回后都会调用cleanup 最终,我真正想做的是在调用我的_命令后进行清理,但仍然将其作为最后一个命令,因此返回值是隐式的。任何建议的替代方案都将不胜感激 cleanup() { # generic cleanup w/

有没有办法在陷阱处理程序中禁用陷阱

我想通过使用返回陷阱简化一些代码。my_func将返回my_命令的值。当my_func返回时,TMP文件将被清理。这项技术允许我避免分配一个临时变量来保存$?当我做清理时,从我的函数

但是,我无法在处理程序中重置陷阱处理程序,现在在每个函数返回后都会调用cleanup

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

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
}

我总是使用这种模式:

trap 'rm -rf "$workspace"' EXIT
workspace="$(mktemp --directory)" # Or -d
# Use $workspace
这有几个很好的特点:

  • 陷阱是在创建目录之前设置的,因此不存在争用条件
  • 创建目录意味着我不需要在脚本中再调用任何
    mktemp
    ,因为我可以将所有内容都放在该目录中
  • 创建目录而不是文件可以提供更好的安全基线,因为每个人都可以直接看到
    /tmp
    中的内容,但新目录将由您拥有,并将创建“u+rwx,减去umask限制”(来自
    man mktemp

  • 如果你想早点清理的话,我建议你直接清理。您的解决方案有两个不必要的间接层次:陷阱和要运行的参数传递。

    感谢您的回复。事实上,我已经使用了这个临时目录模式,它非常有用。这个例子只是一个更大的脚本的简单摘录。cleanup函数可以运行任何东西(可能不仅仅是删除一个文件)。例如,有时我需要清除屏幕(但我不希望在每次函数退出后都清除屏幕)。我的问题的实质是,在Java中是否存在类似于finally块的东西。请不要担心清理代码实际上在做什么;例如,在Zsh中,可以在陷阱处理程序中重置陷阱。我使用这个技巧来恢复
    INT
    陷阱。(
    RETURN
    在Zsh中被称为
    EXIT
    ,它是本地的,所以您甚至不需要清理陷阱本身。)