Bash 在没有临时文件的情况下还原陷阱

Bash 在没有临时文件的情况下还原陷阱,bash,sh,bash-trap,shell-trap,Bash,Sh,Bash Trap,Shell Trap,不带参数的陷阱为所有陷阱打印当前设置的命令。但是,子shell不会继承陷阱,因此保存和恢复陷阱的规范示例在bash中失败: save_traps=$(trap) ... eval "$save_traps" 保存陷阱=$(陷阱) ... 评估“$save_陷阱” 赋值RHS上的陷阱在子shell中运行,因此save_陷阱始终是空字符串。除了将trap的输出写入临时文件之外,脚本如何找到陷阱的当前命令集?尽管Bash manpage似乎表示陷阱在子hell中被重置,命令替换在子shell中执行,运

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

save_traps=$(trap) ... eval "$save_traps" 保存陷阱=$(陷阱) ... 评估“$save_陷阱”
赋值RHS上的陷阱在子shell中运行,因此save_陷阱始终是空字符串。除了将
trap
的输出写入临时文件之外,脚本如何找到陷阱的当前命令集?

尽管Bash manpage似乎表示陷阱在子hell中被重置,命令替换在子shell中执行,运行
trap
内部的
$()
无论如何都有效(在Bash3.2和4.2中进行了测试)。POSIX中还提到,
traps=$(trap)
应该可以工作

感谢
irc.freenode.net的
bash中的
pgas
对我有用

创建一个示例陷阱:

$ trap
$ trap echo SIGIO
$ trap
trap -- 'echo' SIGIO
将陷阱存储到
保存陷阱中

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

在主脚本中,您可以
将陷阱导出到子shell中吗?不管怎样,即使使用临时文件,您也可以将其作为单个命令编写:
trap>trap.$$&&save\u traps=$(
。没有
save\u traps=$(trap)那么简洁
,但至少你不会一直有一个临时文件在浮动。@ruakh临时文件的问题是无法确保它被删除。通常,在创建文件之前,你设置了一个陷阱来删除该文件,但这不能在这里完成,因为你丢失了陷阱的上一个值。在“一行程序并不能避免将临时文件留在文件系统上的可能性。@Williampersell:好吧,但即使设置陷阱也不能确保文件被删除,因为你不能确保陷阱运行,即使它运行,你也不能确保它成功删除文件。那么,临时文件被删除的可能性有多大?”文件没有被删除?这在您的整个系统中有多重要?您不能在脚本开始时对陷阱tmpfiles进行预扫描吗?或者如果您的程序从未停止过,请使用crontab条目查找陷阱tmpfiles,等待一秒钟,然后将其删除?不太好,但我认为您正面临unix进程和shell之间的权衡。是吗你真的想用Java(或其他被高度禁止的语言?;-)编码吗?我的项目通常是低风险的,所以对于低概率的情况,我就放手了。也许zsh或rc有4个这样的东西?祝你好运!事实上,它在3.2.25中起作用,而我在3.00.15中看到的失败。这是一个令人难以置信的恼人的错误。要保存特定的信号,例如INT,你可以使用“save_traps=$(trap-p INT)”