2011-02-06 190 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