在没有临时文件的情况下恢复陷阱

时间:2012-03-08 15:25:33

标签: bash sh bash-trap shell-trap

不带参数trap打印所有陷阱的当前设置命令。但是,子shell不会继承陷阱,因此保存和恢复陷阱的规范示例在bash中失败:

save_traps=$(trap)
...
eval "$save_traps"

赋值的RHS上的陷阱在子shell中运行,因此save_traps始终为空字符串。除了将trap的输出写入临时文件之外,脚本如何找到陷阱的当前命令集?

2 个答案:

答案 0 :(得分:4)

适合我。

创建样本陷阱:

$ trap
$ trap echo SIGIO
$ trap
trap -- 'echo' SIGIO

将陷阱存储到save_traps

$ save_traps=$(trap)

卸下:

$ trap SIGIO
$ trap | wc -l
   0

还原:

$ eval "$save_traps"
$ trap
trap -- 'echo' SIGIO

经过测试:

$ bash --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin12)
Copyright (C) 2007 Free Software Foundation, Inc.

答案 1 :(得分:1)

虽然Bash手册页似乎表示在子shell中重置了陷阱,并且子shell中执行了命令替换,但无论如何在trap内运行$()(在Bash 3.2和4.2中测试)。 POSIX中还提到traps=$(trap)应该有效。

感谢pgas #bash irc.freenode.net的{​​{1}}。