Один из распространенных способов:
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"