
Хотел повторить команду в функции. Для тестирования я написал неправильную команду ( lsss
). Она должна была повториться 5 раз и потерпеть неудачу, но она застряла в бесконечном цикле.
#!/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
решение1
В вашем "вопросе" нет вопроса. Я предполагаю, что вопрос "почему?".
Всякий раз, когда LIST
запускается, lsss
терпит неудачу, поэтому RETRY LIST
вызывается. Затем (изнутри RETRY
) LIST
(как $CMD
) запускается снова, и мы можем объяснить с самого начала.
Bash никогда не выходит за пределы $CMD
inside RETRY
. Ваши две функции вызывают друг друга, они все больше и больше накладываются друг на друга; ни одна из них на самом деле не выходит.
Я думаю, что весь ваш подход несовершенен. Я не знаю, какова точная цель, но для того, чтобы «попробовать команду ограниченное количество раз», это может быть вашей отправной точкой:
(max=5; for n in `seq 1 $max`; do your_command && break; done)
Подоболочка используется для того, чтобы держаться $max
подальше от текущей оболочки. Обратите внимание, что вся команда возвращает вполне разумный код выхода.