2012-10-19 12 views
113

Napisałem test fuzzy, który nie działa niewiarygodnie. Dodałem kod debugowania, ale teraz chcę uruchomić test, dopóki się nie zawiedzie, więc mogę zebrać dane wyjściowe debugowania.Wielokrotnie uruchamiaj polecenie powłoki, dopóki się nie zawiedzie?

mam ustawić test więc mogę go uruchomić za pomocą:

./runtest 

Moje obecne rozwiązanie jest napisać untilfail skrypt:

#!/bin/bash 
[email protected] 
while [ $? -eq 0 ]; do 
    [email protected] 
done 

następnie użyć go:

untilfail ./runtest 

Czy istnieje prostsze rozwiązanie?

+7

Nota boczna: zwyczajowy cytat "$ @". – jordanm

Odpowiedz

185

while wykonuje polecenia do wykonania, dzięki czemu można używać prostsze

while ./runtest; do :; done 

Spowoduje to zatrzymanie pętli przy ./runtest zwraca niezerowe kod wyjścia (który jest zwykle świadczy o awarii).

+17

Warto również zauważyć, że '[jest poleceniem. To powszechne nieporozumienie z nowymi użytkownikami, że '[' jest częścią składni 'if' i' while'. – jordanm

+1

Jak mogę sprawdzić, ile razy trwało, zanim się nie powiodło? – GrantJ

+0

@GrantJ: Wygląda na to, że łatwiej byłoby napisać skrypt Pythona do dodawania takich rzeczy. –

5

Jeśli nie chcesz, aby otoczyć kompleksową rurociągu w skrypcie powłoki lub funkcji następnie to działa:

while true; do 
    curl -s "https:..." | grep "HasErrors.:true" 
    if [[ "$?" -ne 0 ]]; then 
    break 
    fi 
    sleep 120 
done 

Żądanie HTTP w tym przypadku zawsze zwraca 200, ale również zwraca jakąś JSON, który ma atrybut "HasErrors": true, gdy wystąpił błąd.

Powiązane problemy