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, mkdir
prawdopodobnie 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 die
powyżej bez argumentów)
Na wypadek, gdybyś nie widział command1 || command2
wcześniej, działa command1
, a jeśli command1
zawiedzie, 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ć dies
dalej 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/path
wiele 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"