防止 bash 打印“<PID> Aborted”消息

Posted

技术标签:

【中文标题】防止 bash 打印“<PID> Aborted”消息【英文标题】:Prevent bash from printing “<PID> Aborted” messages 【发布时间】:2011-02-06 06:33:29 【问题描述】:

我有一个测试脚本,它通过各种输入一遍又一遍地运行一个小应用程序:

# test_script.sh

for input1 in $some_range; do
    for input2 in $some_other_range; do
        if ! ./my_app $input1 $input2 2>/dev/null; then
            echo "ERROR: app failed with inputs: $input1 $input2"
        fi
    done
done

这一切都很好,除了失败时我收到两条消息,我想要的“错误”消息,然后是另一个(显然来自 bash?)提醒我我的应用程序已中止:

test_script.sh: line 10:   641 Aborted           ./my_app $input1 $input2
ERROR: app failed with inputs: XXX YYY

如何防止出现“已中止”消息?

另请注意:应用程序可能在标准 C 库“断言”语句上失败。

【问题讨论】:

这不能解决您的问题,但错误消息应该发送到 stderr,因此您的回声应该被重定向。例如'echo "ERROR ..." >&2' 【参考方案1】:

我也遇到了这个。如果子进程返回状态码 134,表明子进程收到了SIGABRTbash 本身似乎会单方面打印此内容。解决方案是在子shell 中运行子进程,然后确保子shell 在失败时返回不同的(仍然非零)状态代码,并将其输出重定向到/dev/null。例如:

if ! ( ./myapp || false ) >/dev/null 2>&1; then
    ...
fi

【讨论】:

巧妙。非常感谢!【参考方案2】:

尝试禁用作业控制:

set +m

【讨论】:

【参考方案3】:

你可以将stderr重定向到/dev/null

./myapp .... 2&gt;/dev/null

【讨论】:

我已经将命令的标准错误重定向到/dev/null;我会更新这个问题。该消息似乎来自 bash,而不是应用程序,因为它指定了中止进程的行号。【参考方案4】:

您可能不应该隐藏错误消息。不要让您的脚本发出错误消息并抑制应用程序中的错误,而是让脚本什么也不说,让应用程序的错误消息打印出来。如果您不喜欢来自应用程序的错误消息,请在应用程序中修复它,而不是尝试让脚本修补它。

【讨论】:

【参考方案5】:

您可以使用$() 来包装您的命令,例如:

$($app &> /dev/n

【讨论】:

你的答案可能需要整理吗?

以上是关于防止 bash 打印“<PID> Aborted”消息的主要内容,如果未能解决你的问题,请参考以下文章

防止 MSYS 'bash' 杀死捕获 ^C 的进程

如何防止命令出现在 Bash 历史记录中?

如何防止在 Docker 容器中运行的 bash 中扭曲西里尔文文本?

华为使用的bash脚本, 防止删库悲剧发生!

Git hook prepare-commit-msg 以防止合并禁止的分支 - 将 Ruby 转换为 Bash

为啥 echo "$0" 不在 bash 中打印脚本名称? [复制]