2011-02-06 152 views
7

我有一个测试脚本与各种输入一遍又一遍运行一个小应用程序再次:防止庆典

# 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 

这是一切都很好,当它失败时,除了我得到两个消息,在“错误”的消息我想要的,然后又是(显然是从庆典?)提醒我,我的应用程序被中止:

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

如何防止“中止”的消息?

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

+0

这并没有解决您的问题,但错误消息应该去标准错误,所以你的回声应该重定向。例如'echo'ERROR ...“>&2' – 2011-02-06 14:24:46

回答

0

可以重定向错误输出到/dev/null

./myapp .... 2>/dev/null

+0

我已经将命令的stderr重定向到/ dev/null;我会更新这个问题。该消息似乎来自bash,而不是应用程序,因为它指定了中止进程的行号。 – aaronstacy 2011-02-06 06:40:27

1

尝试禁用作业控制:

set +m 
+0

似乎没有帮助。 – FeepingCreature 2012-07-14 09:54:11

0

你可能不应该取消错误信息。不要让脚本发出错误消息并禁止应用程序发生错误,请让脚本不说话,并让应用程序的错误消息打印出来。如果您不喜欢应用程序中的错误消息,请在应用程序中修复它,而不是尝试让脚本对其进行修补。

0

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

$($app &> /dev/n 
+2

您的答案可能需要整理吗? – Ryan 2013-06-15 17:48:15

4

我只是碰到了这一点。看起来bash自己单方面打印这个,如果一个子进程返回状态代码134,表明孩子收到SIGABRT。解决方案是在子shell中运行子进程,然后确保子shell在失败时返回一个不同的(非零)状态码,并将其输出重定向到/dev/null。例如:

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