¿Cómo manejo la falla de un comando en una función de bash?

1

Tengo una función bash en uno de nuestros servidores de prueba que implementa nuestro código, pero uno de los comandos falla con frecuencia y no podemos encontrar la causa. Solo reintentamos hasta que funcione.

Quiero que la función vuelva a intentarlo si falla ese comando. En la función, hice algo como esto:

command_to_run || { echo "failed, retrying"; call_function; }

Lo que vuelve a llamar a la función como quisiera, pero también permite que la función continúe su ejecución. ¿Cómo detengo la ejecución de la función actual antes de volver a llamarla?

Brennan Holzer
fuente

Respuestas:

7

Aquí hay una variante aún más simple de la sugerencia de @terdon:

while ! command_to_run; do
    echo "failed, retrying"
    sleep 1
done

while en realidad toma un comando, por lo que puede probar el éxito / fracaso de command_to_run directamente en lugar de tener que lidiar con $?. Normalmente, while ejecuta el bucle siempre que el comando tenga éxito; en este caso, yo uso ! para negarlo y ejecutar el bucle siempre que el comando falle (es decir, hasta que tenga éxito).

Gordon Davisson
fuente
+1 Esta es la mejor respuesta.
chepner
De hecho es, +1.
terdon
4

Pruebe un bucle while:

er=1; while [[ $er != 0 ]]; do command_to_run; er=$?; sleep 1; done

Bash guarda el estado de salida del último comando en la variable especial $?. El bucle anterior guarda el estado de salida de command_to_run como $er y luego vuelve a ejecutar el comando hasta que un estado de salida de 0 (Salido correctamente) se devuelve. Se esperará un segundo entre ejecuciones como lo sugiere Flup en los comentarios a continuación.

terdon
fuente
podría querer poner un sleep allí para evitar un bucle estrecho.
Flup
@Flup buen punto, hecho.
terdon
El sueño no será necesario ya que el comando es de larga duración. Esto funcionó como un encanto, gracias!
Brennan Holzer
0

Encuentro until Es más legible en este caso.

until command_to_run; do
    echo "failed, retrying"
    sleep 1
done
dogbane
fuente