我使用的程序工作正常,在操作结束时产生理想的输出,没有内存泄漏或任何其他特定问题,但在退出时会出现分段故障。当使用这个程序时,我一直试图通过将标准错误重定向到Null来向最终用户隐藏这个无害但令人讨厌的错误:
program options >file 2>/dev/null
但这不起作用,每次运行程序时,错误都会显示在脚本输出的中间。这里到底发生了什么,我如何隐藏不想要的错误?我在约塞米蒂。
来自不良想法部门:
program options >file 2>/dev/null | cat
bash似乎不会抱怨那些输出通过管道传输到其他地方的程序中的分段错误。所以,只要把你的输出管道到任何地方。cat
是一个不错的选择,因为它只是回显发送的文本。或者管道到空命令:
,这样您就可以在脚本中放入一个表情符号:
program options >file 2>/dev/null |:
很明显,这可能会隐藏其他更严重的问题,因此,如果可能的话,您应该修复分割错误。
我的建议是修复这个错误。
隐藏错误的问题有两个:
-
该错误可能不是无害的。除非你确定了真正的原因,否则你无法确定。
-
任何你实现来隐藏这个错误的东西都可能隐藏其他的错误。。。与可能还不存在,或者可能存在但还没有表现出来。
这个程序不是我的,我不知道如何修复它
您需要与开发人员/供应商讨论此问题。要么自己获取源代码并修复它,要么向他们施加压力以修复它。(有多种方法可以完成后者……取决于软件的性质和支持安排。)
如果您真的需要一个变通方法,那么看看bash是如何处理信号的。基于重定向不起作用的事实,我怀疑发生的事情是bash自己生成消息,并将其写入控制台流。一种可行的方法是在bash脚本中为SIGSEGV实现一个自定义信号处理程序。这种方法的优点(相对于其他"黑客")是有点选择性。
当然,还有其他更"残忍"的方式:
-
在子shell中运行应用程序,并在主包装器脚本中重定向子shell的stderr。
-
管道连接到
true
以抑制信号报告。(见其他答案。我不知道你能做到。)