Tentando comandos no bash por um número limitado de vezes

Tentando comandos no bash por um número limitado de vezes

Queria repetir um comando em função. Para teste, escrevi o comando errado ( lsss). Ele deveria tentar 5 vezes e falhar, mas ficou preso em um loop infinito.

#!/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

Responder1

Não há dúvida na sua "pergunta". Presumo que a pergunta seja "por quê?".

Sempre que LISTé executado, lsssfalha, então RETRY LISTé invocado. Então (de dentro de RETRY) LIST(as $CMD) é executado novamente e podemos explicar desde o início.

Bash nunca passa $CMDpor dentro RETRY. Suas duas funções se chamam, elas se acumulam cada vez mais; nenhum deles realmente existe.


Acho que toda a sua abordagem é falha. Não sei qual é o propósito exato, mas para "tentar um comando por um número limitado de vezes", este pode ser o seu ponto de partida:

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

Um subshell é usado para ficar $maxfora do shell atual. Observe que todo o comando retorna um código de saída bastante sensato.

informação relacionada