Como executo vários scripts dentro de um script, mesmo que um script falhe?

0

Eu tenho um script simples que executa vários outros scripts…

#/bin/bash
…
./update_artifact1.sh $ARTIFACT_VERSION
./update_artifact2.sh $ARTIFACT_VERSION
./update_artifact3.sh $ARTIFACT_VERSION

O problema é que, se o primeiro comando (ou segundo) morrer com um erro, nenhum dos comandos subseqüentes será executado. Existe uma maneira de executar todos os três comandos, salvar o status de saída de cada um e, em seguida, retornar um status de saída bem-sucedido se todos os três forem executados com êxito? Os scripts não precisam ser executados simultaneamente.

    
por Dave 21.02.2014 / 22:15

1 resposta

0

Você pode modificar um pouco seu script dessa maneira

#!/bin/bash
…
./update_artifact1.sh $ARTIFACT_VERSION
exit_state_1=$?
./update_artifact2.sh $ARTIFACT_VERSION
exit_state_2=$?
./update_artifact3.sh $ARTIFACT_VERSION
exit_state_3=$?
exit_state_all=$[ $exit_state_1 &&  $exit_state_2 && $exit_state_3 ]
exit $exit_state_all

Nota:

  • Cada comando retorna um código de saída que bash armazena em $? . É 0 se não houver erro ou um número diferente se houver um erro.
    Depois de cada linha, o valor de $? é atualizado, então você precisa armazenar em uma variável (nesse caso, usamos exit_state_1 ... exit_state_n ).
    No final, você quer que seu script retorne somente um código de erro com 0, se estiver tudo ok, e percebemos isso com $[ $a || $b || $c ] .
    Observe que $[ 0|| 0 || 0 ] é 0 enquanto $[ $a || $b || $c ] com pelo menos um em $a,$b,$c diferente de 0 retorna 1.
  • É importante o ! na primeira linha quando você tem que escrever #!/bin/bash para dizer ao sistema que é um script que deve ser executado em um bash shell.
    Você pode achar interessante ler mais sobre o shebang aqui.
  • Como observado em um comentário também se você colocar set -e em algum lugar no seu script antes dessas linhas, o script será interrompido no primeiro erro sem processar a outra linha, e retornará um código de erro (o do último comando executado).
por 25.06.2014 / 16:26