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

问题描述 投票:0回答:3

我使用的程序可以正常工作,并在操作结束时产生理想的输出,没有内存泄漏或任何其他特定问题,但随后它在退出时发出分段错误。我一直试图通过将标准错误重定向到 Null 来隐藏最终用户在使用此程序时出现的无害但烦人的错误:

program options >file 2>/dev/null

但这不起作用,每次运行程序时错误都会出现在脚本输出的中间。这里究竟发生了什么,如何隐藏不需要的错误?我在优胜美地。

macos bash segmentation-fault posix stderr
3个回答
6
投票

来自坏主意部门:

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

bash 似乎不会抱怨输出通过管道传输到其他地方的程序中的分段错误。所以只需将输出传送到任何地方即可。

cat
是一个不错的选择,因为它只是回显发送的文本。或者通过管道传输到空命令,
:
,这样您就可以在脚本中添加表情符号:

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

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


2
投票

我的建议是修复错误。

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

  • 该错误可能并非无害。在确定真正原因之前,您无法确定。

  • 您实现的任何隐藏this错误的方法也可能隐藏other错误......可能尚不存在,或者可能存在但尚未显现出来。


该程序不是我的,我不知道如何修复它。

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


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

当然,还有其他更“残酷”的方式:

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

  • 通过管道连接到

    true
    以抑制信号报告。 (请参阅其他答案。我不知道你可以做到这一点。)


0
投票

@yellowantphil 的答案是在 bash 和 zsh 中隐藏输出

Segmentation fault
,但不在 ash、dash、busybox sh 和 mksh 中隐藏输出。在所有提到的 shell 中起作用的是使用
exec
:

重定向 shell 的 stderr
(exec 2>/dev/null
 program options >file 2>/dev/null)

一些不是问题的一部分,但在程序源代码存储库中的测试套件脚本中有用的东西,将测试是否存在分段错误,这将通过测试

$?
是否相等来完成到 139。

© www.soinside.com 2019 - 2024. All rights reserved.