Como escrever um script abort-on-error sem adicionar '|| sair $? para todas as linhas?

5

Estou escrevendo um script bash que deve sair do código de erro do último comando com falha e não continuar a execução. Isto pode ser conseguido adicionando um || exit $? em todos os lugares, mas existe uma maneira mais fácil, por ex. uma opção set no começo para fazer isso sem enlouquecer todas as linhas?

    
por Tobias Kienzler 17.10.2012 / 12:02

3 respostas

13

set -e ?

set: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]
Set or unset values of shell options and positional parameters.

Change the value of shell attributes and positional parameters, or
display the names and values of shell variables.

 Options:
   -a  Mark variables which are modified or created for export.
   -b  Notify of job termination immediately.
   -e  Exit immediately if a command exits with a non-zero status. 
...
    
por 17.10.2012 / 12:09
3

Você pode juntar todos os comandos com && e usar || exit $? no final do bloco. Por exemplo:

#!/usr/bin/ksh
ls ~/folder &&
cp -Rp ~/folder ~/new_folder &&
rm ~/folder/file03.txt &&
echo "This will be skipped..." ||
exit $?

se não houver arquivo ~/folder/file03.txt , o último comando echo será ignorado. Você deve receber algo assim:

$ ./script.ksh
file01.txt  file02.txt
rm: cannot remove /export/home/kkorzeni/folder/file03.txt: No such file or directory
$ echo $?
1

Atenciosamente, Krzysztof

    
por 17.10.2012 / 18:52
3

Você pode definir uma função de interceptação para capturar qualquer erro que esteja ocorrendo no script.

#!/usr/bin/ksh
trap errtrap

function errtrap {
    es=$?
    echo "'date' The script failed with exit status $es " | $log
}

resto do script segue.

A TRAP irá capturar qualquer erro em qualquer comando e chamará a função errtrap . Para um melhor uso, você pode tornar a função errtrap genérica e chamar isso em qualquer script que esteja criando.

    
por 05.02.2016 / 09:31

Tags