2011-02-06 8 views
7

Mam skrypt testowy, który prowadzi małą aplikację w kółko z różnymi wejściami:Prevent bash od drukowania komunikatów „<PID> przerwana”

# 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 

To wszystko jest dobrze, z wyjątkiem, gdy nie powiedzie się mam dwie wiadomości, komunikat „błąd” Chcę, a potem jeszcze (podobno od bash?) ostrzegając mnie, że moja aplikacja została przerwana:

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

Jak mogę zapobiec wyświetlaniu komunikatów „przerwana”?

Uwaga: Aplikacja prawdopodobnie zawodzi w standardowej instrukcji "asert" biblioteki C.

+0

To nie odpowiada na twoje pytanie, ale komunikat o błędzie powinien przejść do stderr, więc twoje echo powinno zostać przekierowane. na przykład 'echo "ERROR ..."> & 2' –

Odpowiedz

0

można przekierować stderr do /dev/null

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

+0

Już przekierowuję stderr polecenia do/dev/null; Zaktualizuję pytanie. Komunikat wydaje się pochodzić z basha, a nie z aplikacji, ponieważ określa numer linii przerwanego procesu. – aaronstacy

0

Prawdopodobnie nie powinien pominąć komunikat o błędzie. Zamiast wysyłania przez skrypt komunikatu o błędzie i wyłączania błędu aplikacji, pozwól, aby skrypt nic nie mówił i niech wydrukuje komunikat o błędzie aplikacji. Jeśli nie podoba ci się komunikat o błędzie z aplikacji, napraw go w aplikacji, zamiast próbować go załatać.

0

Można użyć $() owinąć swoje polecenia, na przykład:

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

Czy twoja odpowiedź może wymagać wykończenia? – Ryan

4

po prostu wpadł na to zbyt. Wydaje się, że samo to drukuje jednostronnie, jeśli proces potomny powraca z kodem stanu 134, wskazując, że dziecko otrzymało SIGABRT. Rozwiązaniem jest uruchomienie procesu podrzędnego w podpowłoce, a następnie upewnienie się, że podpowiedź zwraca inny (wciąż niezerowy) kod stanu w przypadku awarii, a jego wynik jest przekierowywany na /dev/null. Na przykład:

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