![Попытка выполнить команды в bash ограниченное количество раз](https://rvso.com/image/1543335/%D0%9F%D0%BE%D0%BF%D1%8B%D1%82%D0%BA%D0%B0%20%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D1%8C%20%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D1%8B%20%D0%B2%20bash%20%D0%BE%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%BD%D0%BE%D0%B5%20%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%BE%20%D1%80%D0%B0%D0%B7.png)
Хотел повторить команду в функции. Для тестирования я написал неправильную команду ( 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
подальше от текущей оболочки. Обратите внимание, что вся команда возвращает вполне разумный код выхода.