Один поширений спосіб:
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"