Как мне выполнить мой сценарий еще одну команду после того, как предыдущая команда вернет ненулевое значение до того, как оно будет прервано?

У меня есть сценарий оболочки, который вызывает скрипт Perl для обработки некоторых файлов. Скрипты Perl выходят либо с нулевым, либо с одним значением. У меня есть команда set -e Unix в начале моего скрипта, чтобы прервать скрипт, если скрипт Perl выходит со значением один. Мне просто интересно, есть ли какая-либо команда в Unix, которую я могу использовать, чтобы выполнить одну команду до того, как скрипт будет прерван, если сценарий Perl завершится с одним значением? По сути, я хочу, чтобы сценарий отправил мне электронное письмо о том, успешно ли запущен скрипт Perl. Мой код выглядит следующим образом:

 #!/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 

Просто не используйте set -e и добавьте выход в ветку if fail. Если вы хотите, чтобы это поведение остальной части скрипта добавляло set -e после вызова электронной почты.

Использовать set -e

Ты можешь написать:

 #!/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 

Объяснение :

В справочном руководстве Bash говорится:

-e Выйти немедленно, если конвейер, который может состоять из одной простой команды, возвращает ненулевой статус. Оболочка не выходит, если неудавшаяся команда является частью теста в выражении if .

Условные конструкции (если) :

Синтаксис команды if

 if test-commands; then consequent-commands; [elif more-test-commands; then more-consequents;] [else alternate-consequents;] fi 

Выполняется список тестовых команд, и если его статус возврата равен нулю, выполняется список последовательных команд. Если присутствуют «другие альтернативные последствия», а заключительная команда в финальном условии if или elif имеет ненулевой статус выхода, то выполняются альтернативные действия.

См. Также: Использование режима Неофициальный Bash Strict (если вы не отлаживаете Looove)