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 LIST
die Ausführung lsss
fehlschlägt , RETRY LIST
wird 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 $CMD
inside 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)
$max
Um die aktuelle Shell zu meiden, wird eine Subshell verwendet . Beachten Sie, dass der gesamte Befehl einen recht vernünftigen Exit-Code zurückgibt.