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 LIST
que se ejecuta, lsss
falla, por lo que RETRY LIST
se invoca. Luego (desde el interior de RETRY
) LIST
(as $CMD
) se ejecuta nuevamente y podemos explicarlo desde el principio.
Bash nunca pasa $CMD
por 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 $max
fuera del shell actual. Tenga en cuenta que todo el comando devuelve un código de salida bastante sensato.