防止 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,表明子进程收到了SIGABRT
,bash
本身似乎会单方面打印此内容。解决方案是在子shell 中运行子进程,然后确保子shell 在失败时返回不同的(仍然非零)状态代码,并将其输出重定向到/dev/null
。例如:
if ! ( ./myapp || false ) >/dev/null 2>&1; then
...
fi
【讨论】:
巧妙。非常感谢!【参考方案2】:尝试禁用作业控制:
set +m
【讨论】:
【参考方案3】:你可以将stderr重定向到/dev/null
./myapp .... 2>/dev/null
【讨论】:
我已经将命令的标准错误重定向到/dev/null;我会更新这个问题。该消息似乎来自 bash,而不是应用程序,因为它指定了中止进程的行号。【参考方案4】:您可能不应该隐藏错误消息。不要让您的脚本发出错误消息并抑制应用程序中的错误,而是让脚本什么也不说,让应用程序的错误消息打印出来。如果您不喜欢来自应用程序的错误消息,请在应用程序中修复它,而不是尝试让脚本修补它。
【讨论】:
【参考方案5】:您可以使用$()
来包装您的命令,例如:
$($app &> /dev/n
【讨论】:
你的答案可能需要整理吗?以上是关于防止 bash 打印“<PID> Aborted”消息的主要内容,如果未能解决你的问题,请参考以下文章
如何防止在 Docker 容器中运行的 bash 中扭曲西里尔文文本?