Apenas não use set -e
e adicione uma saída à sua ramificação if
fail. Se você quiser esse comportamento para o restante do script, adicione o set -e
após a chamada de e-mail.
Eu tenho um script de shell que chama um script Perl para fazer algum processamento de arquivo. Os scripts Perl saem com um valor zero ou um valor. Eu tenho o comando Unix set -e
no início do meu script para abortar o script se o script Perl sair com um valor de um. Eu só estava me perguntando se existe algum comando no Unix que eu possa usar que execute um comando antes que o script seja abortado se o script Perl sair com um valor? Essencialmente, quero que o script me envie um email informando se o script Perl foi executado com êxito. Meu código se parece com isso agora:
#!/bin/bash
set -e
function email_success {
#Some code for the email
}
function email_fail {
#Some code for the email
}
usr/bin/perl perlscript.pl
if [$? -eq 0]; then
email_success
else
email_fail
fi
#More commands to be executed if its successful
Use set -e
Você pode escrever:
#!/bin/bash
set -e
# function email_success {...}
# function email_fail { ... }
if /usr/bin/perl perlscript.pl; then
email_success
else
email_fail
exit 1
fi
#More commands to be executed if its successful
Explicação :
Manual de referência do Bash diz:
-e
Exit immediately if a pipeline, which may consist of a single simple command, returns a non-zero status. The shell does not exit if the command that fails is part of the test in anif
statement.
Construções condicionais (if) :
The syntax of the if command is
if test-commands; then consequent-commands; [elif more-test-commands; then more-consequents;] [else alternate-consequents;] fi
The test-commands list is executed, and if its return status is zero, the consequent-commands list is executed. If ‘else alternate-consequents’ is present, and the final command in the final if or elif clause has a non-zero exit status, then alternate-consequents is executed.
Veja também: Use o Modo Estrito Unofficial Bash (A menos que você elimine Depuração)