Пробовать команды в bash ограниченное количество раз

0

Хотел повторить команду в функции. Для тестирования я написал неправильную команду ( 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
ZIM
источник
Пожалуйста, сделайте отступ в своем коде правильно.
G-Man

Ответы:

0

Там нет вопроса в вашем "вопрос". Я предполагаю, что вопрос «почему?».

Всякий раз, когда LISTвыполняется, lsssтерпит неудачу, так RETRY LISTвызывается. Затем (изнутри RETRY) LIST(as $CMD) запускается снова, и мы можем объяснить с самого начала.

Баш никогда не проходит $CMDвнутрь RETRY. Ваши две функции вызывают друг друга, они складываются все больше и больше; ни один из них действительно не выходит.


Я думаю, что весь ваш подход имеет недостатки. Я не знаю, какова точная цель, но «попробовать команду ограниченное количество раз», это может быть вашей отправной точкой:

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

Подоболочка используется, чтобы держаться $maxподальше от текущей оболочки. Обратите внимание, что вся команда возвращает вполне нормальный код выхода.

Камил Мачоровский
источник
как я передам $ CMD в RETRY?
Зим
@zim LIST(вызывается изнутри RETRYas $CMD) должен возвращаться, только тогда Bash продолжит работу за $CMDлинией. Но LISTвызывает другого RETRY и ждет его возвращения. Это RETRYвызывает другое LIST и так далее. Я думаю, что весь ваш подход имеет недостатки.
Камиль Мачоровский
я понял. это сработало, но можем ли мы изменить скрипт, чтобы мы могли использовать функцию RETRY.
Зим
@zim Мы не сервис написания сценариев и не форум, это сайт вопросов и ответов. Вы даже не задали вопрос в теле своего «вопроса»; Я должен был угадать. Что мешает вам написать мою «отправную точку» в виде функции? Если вы столкнулись с какой-то конкретной проблемой, то можете задать другой вопрос. Но сначала сделайте свое исследование, покажите некоторые исследования.
Камиль Мачоровски