Probar comandos en bash un número limitado de veces

Probar comandos en bash un número limitado de veces

Quería volver a intentar un comando en función. Para realizar pruebas, escribí el comando incorrecto ( lsss). Debería intentarlo 5 veces y fallar, pero se quedó atascado en un bucle 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

Respuesta1

No hay ninguna pregunta en tu "pregunta". Supongo que la pregunta es "¿por qué?".

Cada vez LISTque se ejecuta, lsssfalla, por lo que RETRY LISTse invoca. Luego (desde el interior de RETRY) LIST(as $CMD) se ejecuta nuevamente y podemos explicarlo desde el principio.

Bash nunca pasa $CMDpor dentro RETRY. Tus dos funciones se llaman entre sí, se acumulan cada vez más; Ninguno de ellos realmente existe.


Creo que todo tu enfoque es defectuoso. No sé cuál es el propósito exacto, pero "probar un comando un número limitado de veces", este puede ser su punto de partida:

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

Se utiliza un subshell para mantenerse $maxfuera del shell actual. Tenga en cuenta que todo el comando devuelve un código de salida bastante sensato.

información relacionada