Jednym z powszechnych sposobów jest:
die() {
IFS=' ' # make sure "$*" is joined with spaces
# output the arguments if any on stderr:
[ "$#" -eq 0 ] || printf '%s\n' "$*" 1>&2
exit 1
}
następnie używasz go w następujący sposób:
mkdir -p some/path || die "mkdir failed with status $?"
Lub jeśli chcesz, aby zawierał status wyjścia, możesz zmienić to na:
die() {
last_exit_status=$?
IFS=' '
printf '%s\n' "FATAL ERROR: $* (status $last_exit_status)" 1>&2
exit 1
}
a następnie korzystanie z niego jest nieco łatwiejsze:
mkdir -p some/path || die "mkdir failed"
Gdy zawiedzie, mkdirprawdopodobnie już wydał komunikat o błędzie, więc drugi może być postrzegany jako zbędny i możesz po prostu:
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
(lub użyj pierwszego wariantu diepowyżej bez argumentów)
Na wypadek, gdybyś nie widział command1 || command2wcześniej, działa command1, a jeśli command1zawiedzie, działa command2.
Możesz więc przeczytać to tak: „utwórz katalog lub umrzyj”.
Twój przykład wyglądałby następująco:
mkdir -p some/path || die "mkdir failed"
cd some/path || die "cd failed"
some_command || die "some_command failed"
Lub możesz wyrównać diesdalej po prawej stronie, aby główny kod był bardziej oczywisty.
mkdir -p some/path || die "mkdir failed"
cd some/path || die "cd failed"
some_command || die "some_command failed"
Lub w następującym wierszu, gdy wiersze poleceń są długie:
mkdir -p some/path ||
die "mkdir failed"
cd some/path ||
die "cd failed"
some_command ||
die "some_command failed"
Ponadto, jeśli zamierzasz używać nazwy some/pathwiele razy, przechowuj ją w zmiennej, abyś nie musiał jej ciągle wpisywać, i możesz ją łatwo zmienić, jeśli zajdzie taka potrzeba. Podczas przekazywania argumentów zmiennych do poleceń należy używać --ogranicznika opcji, aby argument nie był traktowany jako opcja, jeśli zaczyna się od -.
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"