![Tentando comandos no bash por um número limitado de vezes](https://rvso.com/image/1543335/Tentando%20comandos%20no%20bash%20por%20um%20n%C3%BAmero%20limitado%20de%20vezes.png)
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, lsss
falha, 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 $CMD
por 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 $max
fora do shell atual. Observe que todo o comando retorna um código de saída bastante sensato.