Begrenztes Ausprobieren von Befehlen in Bash

Begrenztes Ausprobieren von Befehlen in Bash

Wollte einen Befehl in der Funktion erneut versuchen. Zum Testen habe ich den falschen Befehl ( lsss) geschrieben. Er sollte 5 Mal versucht werden und fehlschlagen, aber er steckt in einer Endlosschleife fest.

#!/bin/bash

RETRY () {

        Attempt=0
        Max_Attempts=5
        CMD=$1
        while [ $Attempt -lt $Max_Attempts ]
        do
            $CMD

        if [ $? -eq 0 ]; then
           echo "succeeded on Attempt $Attempt" >> /tmp/err.txt
            break
        else
                 Attempt=$( expr $Attempt + 1 )
        echo  "Command failed. Attempting  $Attempt/$Max_Attempts" >> /tmp/err.txt
                 sleep 2
        fi
done

}

LIST () {

        lsss  # COMMAND WRITTEN WRONGLY FOR TESTING

        if [ $? -eq 0 ]; then
         echo "SUCCESS" 
        else
        RETRY LIST

        echo "FAILED" 
        fi
}
LIST

Antwort1

Ihre „Frage“ enthält keine Frage. Ich nehme an, die Frage lautet „Warum?“.

Immer wenn LISTdie Ausführung lsssfehlschlägt , RETRY LISTwird aufgerufen. Dann wird (von innen heraus RETRY) LIST(als $CMD) erneut ausgeführt und wir können es von Anfang an erklären.

Bash kommt nie über $CMDinside hinaus RETRY. Ihre beiden Funktionen rufen sich gegenseitig auf, sie stapeln sich immer mehr; keine von ihnen wird wirklich beendet.


Ich denke, Ihr gesamter Ansatz ist fehlerhaft. Ich weiß nicht, was der genaue Zweck ist, aber „einen Befehl eine begrenzte Anzahl von Malen auszuprobieren“, dies könnte Ihr Ausgangspunkt sein:

(max=5; for n in `seq 1 $max`; do your_command && break; done)

$maxUm die aktuelle Shell zu meiden, wird eine Subshell verwendet . Beachten Sie, dass der gesamte Befehl einen recht vernünftigen Exit-Code zurückgibt.

verwandte Informationen