Один из распространенных способов:
die() {
IFS=' ' # make sure "$*" is joined with spaces
# output the arguments if any on stderr:
[ "$#" -eq 0 ] || printf '%s\n' "$*" 1>&2
exit 1
}
тогда вы используете это так:
mkdir -p some/path || die "mkdir failed with status $?"
Или, если вы хотите, чтобы он включал статус выхода, вы можете изменить его на:
die() {
last_exit_status=$?
IFS=' '
printf '%s\n' "FATAL ERROR: $* (status $last_exit_status)" 1>&2
exit 1
}
и затем использовать его немного проще:
mkdir -p some/path || die "mkdir failed"
Когда это не удастся, mkdir
скорее всего уже будет выдано сообщение об ошибке, так что второе может рассматриваться как избыточное, и вы можете просто сделать:
mkdir -p some/path || exit # with the same (failing) exit status as mkdir's
mkdir -p some/path || exit 1 # with exit status 1 always
(или используйте первый вариант die
выше без аргумента)
На случай, если вы раньше не видели command1 || command2
, он запускается command1
, а если command1
не получается, он запускается command2
.
Таким образом, вы можете прочитать это как «сделать каталог или умереть».
Ваш пример будет выглядеть так:
mkdir -p some/path || die "mkdir failed"
cd some/path || die "cd failed"
some_command || die "some_command failed"
Или вы можете выровнять dies
дальше вправо так, чтобы основной код был более очевидным.
mkdir -p some/path || die "mkdir failed"
cd some/path || die "cd failed"
some_command || die "some_command failed"
Или в следующей строке, когда командные строки длинные:
mkdir -p some/path ||
die "mkdir failed"
cd some/path ||
die "cd failed"
some_command ||
die "some_command failed"
Кроме того, если вы собираетесь использовать имя some/path
несколько раз, сохраните его в переменной, чтобы вам не приходилось вводить его снова, и вы можете легко изменить его, если потребуется. И при передаче переменных аргументов командам, обязательно используйте --
разделитель параметров, чтобы аргумент не принимался как параметр, если он начинается с -
.
dir=some/path
mkdir -p -- "$dir" || die "Cannot make $dir"
cd -P -- "$dir" || die "Cannot cd to $dir"
some_command || die "Cannot run some_command"
return $?
на:
встроенную.Если вы действительно хотите получить
exit
сообщение об ошибке и используете Bash, вам также следует подумать об этомset -e
. Отhelp set
:Это, конечно, не дает вам гибкости функции did_it_work (), но это простой способ убедиться, что ваш bash-скрипт останавливается на ошибке без добавления большого количества вызовов к вашей новой функции.
источник
set -e
является полезным. Есть некоторые команды, которые возвращают ненулевое значение при нормальных обстоятельствах (например,diff
). Когда я использую set -e в скрипте, где я ожидаю ненулевой возврат, я делаюcommand || true
.set -e
, вы можете установить «обработчик исключений», чтобы перехватывать все ошибкиtrap did_it_work EXIT
.command && true
. Как то возвращаемое значение не изменяется.command || true
состоит в том, чтобы предотвратитьset -e
выход из скрипта, еслиcommand
возвращается ненулевой код завершения . Это меняет код выхода, потому что нам нужно. Единственное, чтоcommand && true
нужно сделать - это запуститьtrue
(вернуть нулевой код выхода), если `команда выполнена успешно (вернула нулевой код выхода) - это полный запрет.