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

Restore traps without a temp file

提问人:William Pursell 提问时间:3/8/2012 最后编辑:JoltaWilliam Pursell 更新时间:4/11/2017 访问量:911

问:

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

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

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

sh bash-trap shell-trap

评论

0赞 Hai Vu 3/8/2012
在主脚本中,你能把陷阱到子壳吗?export
0赞 ruakh 3/9/2012
值得一提的是,即使使用临时文件,也可以将其编写为单个命令:.没有那么简洁,但至少你不会有一个临时文件一直漂浮在周围。trap > trap.$$ && save_traps=$(< trap.$$) && rm trap.$$save_traps=$(trap)
0赞 William Pursell 3/9/2012
@ruakh 临时文件的问题在于无法确保将其删除。通常,在创建文件之前,您可以设置一个陷阱来删除文件,但在这里无法做到这一点,因为您丢失了陷阱的先前值。将命令编写为单行代码并不能避免将临时文件保留在文件系统上的可能性。
0赞 ruakh 3/9/2012
@WilliamPursell:嗯,但是即使设置陷阱也不能确保文件被删除,因为你无法确保陷阱被运行,即使它运行了,你也无法确保它成功地删除了文件。
0赞 shellter 3/9/2012
那么,临时文件不被删除的概率是多少?这在您的整个系统中有多重要?你不能在脚本开始时对 trap-tmpfiles 进行预扫描,或者如果你的程序永远不会停止,有一个 crontab 条目来查找 trap-tmpFiles,等待一秒钟,然后删除它们吗?不漂亮,但我认为你要面对 unix 进程和 shell 的权衡。你真的想用Java(或其他高度禁止的语言)编码吗?我的项目通常风险较低,所以对于低概率的情况,我放手了。也许 zsh 或 rc 有 4 的东西?祝你好运!

答:

1赞 TaylanKammer 3/15/2012 #1

尽管 Bash 手册页似乎说陷阱在子 shell 中重置,命令替换在子 shell 中执行,但无论如何在里面运行都可以工作(在 Bash 3.2 和 4.2 中测试)。POSIX中也提到了应该起作用。trap$()traps=$(trap)

感谢 in at .pgas#bashirc.freenode.net

评论

0赞 William Pursell 3/15/2012
事实上,它在 3.2.25 中确实有效,而我看到的失败是在 3.00.15 中。这是一个非常烦人的错误。
4赞 Rudolf Adamkovič 10/5/2012 #2

对我有用。

创建示例陷阱:

$ 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.

评论

2赞 Truong Nguyen 8/18/2018
要保存特定信号,例如 INT,您可以使用“save_traps=$(trap -p INT)”