【发布时间】:2017-04-11 16:09:15
【问题描述】:
不带参数trap 为所有陷阱打印当前设置的命令。但是,子 shell 不继承陷阱,因此保存和恢复陷阱的规范示例在 bash 中失败:
分配的 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