【问题标题】:Restore traps without a temp file在没有临时文件的情况下恢复陷阱
【发布时间】:2017-04-11 16:09:15
【问题描述】:

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

保存陷阱=$(陷阱) ... 评估 "$save_traps"

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

【问题讨论】:

  • 在主脚本中,你能export子shell的陷阱吗?
  • 不管怎样,即使使用临时文件,您也可以将其编写为单个命令:trap > trap.$$ && save_traps=$(< trap.$$) && rm trap.$$。不像save_traps=$(trap) 那样简洁,但至少你不会有一个临时文件在整个时间里浮动。
  • @ruakh 临时文件的问题是没有办法确保它被删除。通常,您会在创建文件之前设置一个陷阱以删除该文件,但这不能在此处完成,因为您会丢失之前的陷阱值。以单行方式编写命令并不能避免将临时文件留在文件系统上的可能性。
  • @WilliamPursell:嗯,但是即使设置陷阱也不能确保文件被删除,因为你不能确保陷阱运行,即使运行,您也无法确保它成功删除文件。
  • 那么,临时文件未被删除的概率是多少?这在您的整个系统中有多重要?你不能在脚本开始时对 trap-tmpfiles 进行预扫描,或者如果你的程序永远不会停止,有一个找到 trap-tmpFiles 的 crontab 条目,等待一秒钟,然后删除它们?不漂亮,但我认为你正在反对 unix 进程和 shell 的权衡。你真的想用 Java(或其他高度禁止的语言?;-) 进行编码吗?我的项目通常是低风险的,所以对于低概率的案例,我放手了。也许 zsh 或 rc 有什么 4 这个?祝你好运!

标签: bash sh bash-trap shell-trap


【解决方案1】:

为我工作。

创建一个样本陷阱:

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

【讨论】:

  • 保存特定信号,例如INT,可以使用"save_traps=$(trap -p INT)"
【解决方案2】:

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

感谢pgas#bashirc.freenode.net

【讨论】:

  • 确实它在 3.2.25 中有效,而我看到的失败是在 3.00.15 中。这是一个非常烦人的错误。
猜你喜欢
  • 1970-01-01
  • 2019-11-13
  • 1970-01-01
  • 2020-11-08
  • 2010-11-11
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多