Это действительно вопрос о написании скриптов.
В скриптах sh / bash ряд команд просто запускает серию команд:
cmd1
cmd2
cmd3
Не имеет значения, если таковые имеютсяодна команда «терпит неудачу» (возвращает ненулевой статус выхода);скрипт продолжит выполнение следующего.
Конечным статусом завершения скрипта является статус завершения последней команды, которая выполнила , если только вы не указали конкретный статус:
exit 0
(ноль означает успех).
Если вы хотите выйти сразу при сбое любой команды, вы можете установить опцию -e
:
set -e
cmd1
cmd2
cmd3
Это довольногрубая и не всегда правильная вещь.Обратите внимание, что если cmd2
завершается с ошибкой (выходит из нуля), cmd3
даже не запускается, но оболочка завершает работу с ошибочным состоянием выхода cmd2
.
Для особой фантазии вы можете save статус выхода каждой команды:
cmd1; cmd1_status=$?
cmd2; cmd2_status=$?
cmd3; cmd3_status=$?
Переменная $?
расширяется до статуса выхода команды, которая только что была выполнена.
Конечно, теперь у вас естьчтобы выяснить, что делать с тремя состояниями, так как вы можете выйти только с одним из них, но теперь вы можете выйти с любым из них первым, если таковой имеется:
test $cmd1_status != 0 && exit $cmd1_status
test $cmd2_status != 0 && exit $cmd2_status
exit $cmd3_status
Теперь ваш скрипт безоговорочно выполняет все три команды, но возвращает состояние первой ненулевой ошибки.Если cmd1 и cmd2 оба вернули нулевое состояние, сценарий завершает работу с любым статусом из cmd3.