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"
return $?
ją:
wbudowanym.Jeśli naprawdę chcesz
exit
popełnić błąd i używasz Bash, powinieneś również rozważyćset -e
. Odhelp set
:To oczywiście nie daje elastyczności funkcji did_it_work (), ale jest to prosty sposób, aby upewnić się, że skrypt bash zatrzymuje się na błędzie bez dodawania wielu wywołań do nowej funkcji.
źródło
set -e
jest przydatne. Niektóre polecenia zwracają wartość niezerową w normalnych okolicznościach (na przykładdiff
). Kiedy używam zestawu -e w skrypcie, w którym oczekuję niezerowego zwrotu, robię tocommand || true
.set -e
, możesz ustawić „moduł obsługi wyjątków”, aby wychwytywał wszystkie błędytrap did_it_work EXIT
.command && true
. W ten sposób zwracana wartość nie jest zmieniana.command || true
jest zapobieganieset -e
wychodzeniu ze skryptu, jeślicommand
zwraca niezerowy kod wyjścia. Zmienia kod wyjścia, ponieważ musimy. Jedyne, cocommand && true
robi, to uruchomićtrue
(zwrócić zerowy kod wyjścia), jeśli polecenie się powiedzie (zwróciło zerowy kod wyjścia) - to kompletny brak operacji.