trap
中的部分破折号联机帮助页陈述如下:
陷阱不带任何参数会导致它以某种格式将信号列表及其相关操作写入标准输出适合作为 shell 的输入,实现相同的捕获结果。
惊人的!我想我找到了一种简单的方法来恢复我已经覆盖的以前的信号处理程序,通过trap
将 的输出作为命令反馈给 shell:
trap "echo 'good'" EXIT
# save signal handlers to $traps
traps="$(trap)"
# override EXIT handler
trap "echo 'bad'" EXIT
# reinstate original handlers
eval "$traps"
期望的输出:good
实际输出:bad
这是完全合乎逻辑的,因为$traps
是空的,这又与联机帮助页一致:
当 shell 分叉出子 shell 时,它会将捕获的(但不会被忽略)信号重置为默认操作。
(命令替换$(trap)
分叉出一个子 shell,因此trap
不知道任何信号处理程序。)
一切似乎都按其应有的方式进行。但是我如何利用 的trap
列表功能呢?
答案1
您可以重定向到临时文件:
file=$(mktemp) || exit
{
rm -f -- "$file"
trap
traps=$(cat)
} > "$file" < "$file"
请注意,在这方面dash
'strap
不是 POSIX 作为POSIX 确实需要那:
var=$(trap)
被视为一种特殊情况,其中陷阱不会在子 shell 中重置。
zsh
并且mksh
也有这个问题。但是zsh
,您可以执行以下操作:
trap | IFS= read -rd '' traps