Como manejo a falha de um comando em uma função bash?

1

Eu tenho uma função bash em um de nossos servidores de teste que implanta nosso código, mas um dos comandos falha com freqüência e não podemos encontrar a causa. Nós apenas tentamos até que funcione.

Eu quero ter a função repetir se esse comando falhar. Na função, fiz algo assim:

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

Que chama a função novamente como eu gostaria, mas também permite que a função continue a execução. Como eu paro a execução da função atual antes de chamá-la novamente?

    
por Brennan Holzer 21.03.2013 / 17:17

3 respostas

7

Aqui está uma variante ainda mais simples da sugestão de @ terdon:

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

while recebe um comando, portanto, pode testar o sucesso / falha de command_to_run diretamente, em vez de ter que lidar com $? . Normalmente, while executa o loop desde que o comando seja bem-sucedido; neste caso, eu uso ! para negar isso e executar o loop enquanto o comando falhar (ou seja, até que seja bem-sucedido).

    
por 21.03.2013 / 21:13
4

Tente um loop de tempo:

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

Bash salva o status de saída do último comando na variável especial $? . O loop acima salva o status de saída de command_to_run como $er e, em seguida, executa novamente o comando até que um status de saída de 0 (saído corretamente) seja retornado. Ele esperará um segundo entre as execuções, conforme sugerido por Flup nos comentários abaixo.

    
por 21.03.2013 / 17:24
0

Acho que until é mais legível nesse caso.

until command_to_run; do
    echo "failed, retrying"
    sleep 1
done
    
por 04.02.2014 / 11:01

Tags