Ich habe einen Fuzzy- Test geschrieben, der unzuverlässig fehlschlägt. Ich habe Debug-Code hinzugefügt, aber jetzt möchte ich den Test ausführen, bis er fehlschlägt, damit ich die Debug-Ausgabe erfassen kann.
Ich habe den Test so eingerichtet, dass ich ihn ausführen kann mit:
./runtest
Meine aktuelle Lösung besteht darin, ein untilfail
Skript zu schreiben :
#!/bin/bash
$@
while [ $? -eq 0 ]; do
$@
done
Dann benutze es:
untilfail ./runtest
Gibt es eine einfachere Lösung?
Antworten:
while
Nimmt einen Befehl zum Ausführen, damit Sie den einfacheren verwenden könnenDies stoppt die Schleife, wenn
./runtest
ein Exit-Code ungleich Null zurückgegeben wird (was normalerweise auf einen Fehler hinweist).Um Ihre aktuelle Lösung weiter zu vereinfachen, sollten Sie einfach Ihr tillfail-Skript so ändern, dass es folgendermaßen aussieht:
Und dann können Sie es mit jedem Befehl aufrufen, den Sie bereits verwenden:
quelle
[
ein Befehl ist. Es ist ein häufiges Missverständnis bei neuen Benutzern,[
das Teilif
undwhile
Syntax ist.count=0
vor der Schleife, dann anstelle der:
in der Schleife (a no-op), setzen(( count++ ))
- dieses inkrementiert den Zähler.say
und einem Lautsprecher sind, können Siewhile ./runtest; do :; done && say test failed
benachrichtigt werden, wenn es jemals aufhörtsay
es MacOS-spezifisch ist.Wenn Sie eine komplexe Pipeline nicht in ein Shell-Skript oder eine Shell-Funktion einbinden möchten, funktioniert dies wie folgt:
Die HTTP-Anforderung gibt in diesem Fall immer 200 zurück, gibt aber auch JSON mit dem Attribut "HasErrors" zurück: true, wenn ein Fehler auftritt.
quelle
Nachdem ich ein ähnliches Problem in einem System hatte, in dem die Shell-Wiederholungslogik überall dupliziert wurde, habe ich ein spezielles Tool zur Lösung dieses Problems namens "Wiederholungsversuch" entwickelt:
Ein komplexeres Beispiel:
Tool verfügbar unter https://github.com/minfrin/retry .
quelle