如何在 bash 脚本中隐藏分段错误

How to conceal a segmentation fault in a bash script

我使用的程序可以正常运行并在其操作结束时产生理想的输出,没有内存泄漏或任何其他特定问题,但它在退出时发出分段错误。在使用这个程序时,我一直试图通过将标准错误重定向到 Null:

来向最终用户隐藏这个无害但烦人的错误
program options >file 2>/dev/null

但这不起作用,每次我 运行 程序时,错误都会出现在脚本输出的中间。这里到底发生了什么,我怎样才能隐藏不需要的错误?我在 Yosemite.

我的建议是修复错误。

隐藏错误的问题是双重的:

  • 错误可能不是无害的。在确定真正原因之前,您无法确定。

  • 您为隐藏 this 错误而实施的任何操作也可能会隐藏 other 错误...可能还不存在,或者可能存在但尚未表现出来。


The program is not mine, and I have no idea how to fix it.

您需要与开发商/供应商讨论此事。要么获取源代码并自己修复,要么向他们施加压力以修复它。 (有多种方法可以完成后者……取决于软件的性质和支持安排。)


如果您确实需要解决方法,请查看 bash 如何处理信号。基于重定向不起作用的事实,我怀疑正在发生的事情是 bash 正在生成消息本身,并将其写入控制台流。一种可能的更改方法是在 bash 脚本中为 SIGSEGV 实现自定义信号处理程序。这种方法的优点是(相对于其他 "hacks")有点选择性。

当然还有其他更"brutal"的方式:

  • 运行 子 shell 中的应用程序,并在主包装脚本中重定向子 shell 的标准错误。

  • 通过管道连接到 true 以抑制信号报告。 (请参阅其他答案。我不知道您可以这样做。)

来自坏主意部门:

program options >file 2>/dev/null | cat

似乎 bash 不会抱怨输出通过管道传输到其他地方的程序中的分段错误。因此,只需将您的输出传输到任何地方。 cat 是一个不错的选择,因为它只是回应发送的文本。或通过管道输入空命令 :,这样您就可以在脚本中添加表情符号:

program options >file 2>/dev/null |:

很明显,这会隐藏其他更严重的问题,因此您应该尽可能修复分段错误。