2012-10-19 7 views
113

Ich habe einen fuzzy Test geschrieben, der unzuverlässig ausfällt. Ich habe etwas Debug-Code hinzugefügt, aber jetzt möchte ich den Test ausführen, bis es fehlschlägt, damit ich die Debug-Ausgabe sammeln kann.Wiederholt einen Shell-Befehl ausführen, bis es fehlschlägt?

Ich habe Setup der Test so kann ich führen Sie es mit:

./runtest 

Meine aktuelle Lösung ist ein untilfail Skript zu schreiben:

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

dann verwenden:

untilfail ./runtest 

Gibt es eine einfachere Lösung?

+7

Randnotiz: gewohnheitsmäßig Zitat "$ @". – jordanm

Antwort

185

while nimmt einen Befehl auszuführen, können Sie die einfachere so verwenden

while ./runtest; do :; done 

Dies wird die Schleife stoppen, wenn ./runtest einen Exit-Code ungleich Null zurückgibt (die in der Regel anzeigt Ausfall).

+17

Es ist gut, darauf hinzuweisen, dass '[' ein Befehl ist. Es ist ein häufiges Missverständnis mit neuen Benutzern, dass "[' 'Teil der' if' und 'while' Syntax ist. – jordanm

+1

Wie konnte ich zählen, wie oft es lief, bevor es fehlschlug? – GrantJ

+0

@GrantJ: Es klingt, als wäre es einfacher, ein Python-Skript zu schreiben, um solche Dinge hinzuzufügen. –

5

Wenn Sie nicht über eine komplexe Rohrleitung in ein Shell-Skript oder eine Funktion wickeln wollen, dann funktioniert dies:

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

Die HTTP-Anforderung in diesem Fall immer 200 zurück, aber auch einige JSON zurückgibt, die eine hat Attribut "HasErrors": True, wenn ein Fehler vorliegt.

Verwandte Themen