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

0

Queria tentar novamente um comando em função. Para testar, escrevi o comando errado ( lsss ). Deve tentar por 5 vezes & falhar, mas ficou preso em 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
    
por zim 11.10.2017 / 19:37

1 resposta

0

Não há dúvidas em sua "pergunta". Eu assumo que a pergunta é "por quê?".

Sempre que LIST for executado, lsss falhará, por isso RETRY LIST será chamado. Então (de dentro de RETRY ) LIST (como $CMD ) é executado novamente e podemos explicar desde o início.

O Bash nunca ultrapassa $CMD dentro de RETRY . Suas duas funções chamam umas às outras, elas se acumulam cada vez mais; nenhum deles realmente sai.

Eu acho que toda a sua abordagem é falha. Eu não sei qual é o propósito exato, mas "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 manter $max fora do shell atual. Observe que o comando inteiro retorna um código de saída bastante sã.

    
por 11.10.2017 / 20:09