Agregar código de status de sub-scripts em um script

2

Eu tenho um script bash como este

#!/bin/bash

do-this parm someotherparam
do-something-else $varz $(commands)
and-also-do-this -something
finally-do-something-different -yes

Eu quero que este script retorne o status de saída de 0, se todos os comandos individuais acima retornarem 0. Eu quero que ele retorne diferente de zero se algum dos comandos individuais retornou diferente de zero. Eu não me importo com o valor diferente de zero, desde que não seja 0.

Obviamente, se verificarmos o status após cada linha, podemos alcançar nosso objetivo facilmente, se apenas verboso. Como sou novo no bash, fiquei me perguntando se existe uma maneira idiomática de escrever isso.

Observação: desejo que todos os comandos sejam executados, independentemente de seu status de saída, caso contrário, algo como isso trabalho

    
por Andrew Savinykh 04.02.2017 / 09:24

1 resposta

5
#!/bin/bash

err=0

do-this parm someotherparam             ; (( err |= $? ))
do-something-else $varz $(commands)     ; (( err |= $? ))
and-also-do-this -something             ; (( err |= $? ))
finally-do-something-different -yes     ; (( err |= $? ))

Isso inicializará a variável err para zero e, depois de cada comando, definir err para $err | $? (um OR bit a bit). Isso definirá err como um número diferente de zero se qualquer um dos comandos sair com um status de saída diferente de zero e permanecerá diferente de zero no final do script.

Você pode exit "$err" no final do script, se desejar.

Uma maneira menos manual de obter o mesmo resultado:

err=0
trap '(( err |= $? ))' ERR

# (rest of original script)

Isso define uma interceptação de erro que definirá err da mesma maneira como acima, sempre que um comando sair com status de saída diferente de zero. A armadilha será executada sob as mesmas circunstâncias sob as quais a opção errexit shell ( set -e ) teria terminado o script. Para simplificar, você pode ter o trap apenas definido err=1 , se quiser.

Para remover o trap após uma seção do código, use

trap - ERR
    
por 04.02.2017 / 09:39