是否可以在陷阱处理程序中禁用陷阱?
我想通过使用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
}
答案 0 :(得分:1)
我总是使用这种模式:
trap 'rm -rf "$workspace"' EXIT
workspace="$(mktemp --directory)" # Or -d
# Use $workspace
这有几个不错的功能:
mktemp
调用,因为我可以将所有内容都放在该目录中。/tmp
中直接包含的内容,但是新目录将归您所有,并创建为“ u + rwx,减去umask限制”(来自man mktemp
)。如果您想清理更早,我建议您明确地进行清理。您的解决方案具有两个不必要的间接级别:陷阱和要运行的参数传递。