Хотел повторить команду в функции. Для тестирования я написал неправильную команду ( 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
bash
shell-script
ZIM
источник
источник
Ответы:
Там нет вопроса в вашем "вопрос". Я предполагаю, что вопрос «почему?».
Всякий раз, когда
LIST
выполняется,lsss
терпит неудачу, такRETRY LIST
вызывается. Затем (изнутриRETRY
)LIST
(as$CMD
) запускается снова, и мы можем объяснить с самого начала.Баш никогда не проходит
$CMD
внутрьRETRY
. Ваши две функции вызывают друг друга, они складываются все больше и больше; ни один из них действительно не выходит.Я думаю, что весь ваш подход имеет недостатки. Я не знаю, какова точная цель, но «попробовать команду ограниченное количество раз», это может быть вашей отправной точкой:
Подоболочка используется, чтобы держаться
$max
подальше от текущей оболочки. Обратите внимание, что вся команда возвращает вполне нормальный код выхода.источник
LIST
(вызывается изнутриRETRY
as$CMD
) должен возвращаться, только тогда Bash продолжит работу за$CMD
линией. НоLIST
вызывает другогоRETRY
и ждет его возвращения. ЭтоRETRY
вызывает другоеLIST
и так далее. Я думаю, что весь ваш подход имеет недостатки.