Buduję skrypt powłoki, który ma taką if
funkcję:
if jarsigner -verbose -keystore $keyst -keystore $pass $jar_file $kalias
then
echo $jar_file signed sucessfully
else
echo ERROR: Failed to sign $jar_file. Please recheck the variables
fi
...
Chcę, aby wykonanie skryptu zakończyło się po wyświetleniu komunikatu o błędzie. Jak mogę to zrobić?
Jeśli umieścisz
set -e
skrypt, skrypt zakończy się, gdy tylko jakiekolwiek polecenie w nim zawiedzie (tj. Gdy tylko polecenie zwróci niezerowy status). Nie pozwala to na napisanie własnej wiadomości, ale często wystarczają własne wiadomości polecenia, które się nie udało.Zaletą tego podejścia jest to, że jest automatyczne: nie ryzykujesz, że zapomnisz zająć się przypadkiem błędu.
Polecenia, których stan jest testowany przez warunek (taki jak
if
,&&
lub||
) nie przerywają skryptu (w przeciwnym razie warunek byłby bezcelowy). Idiomem do okazjonalnego polecenia, którego błąd nie ma znaczeniacommand-that-may-fail || true
. Możesz takżeset -e
wyłączyć część skryptu za pomocąset +e
.źródło
-x
flagi z-e
flagą wystarczy do śledzenia miejsca, w którym program się kończy. Oznacza to, że użytkownik skryptu jest również programistą.Jeśli chcesz móc obsłużyć błąd zamiast ślepego zamykania, zamiast używać
set -e
, użyj atrap
naERR
pseudo sygnale.Inne pułapki można ustawić do obsługi innych sygnałów, w tym zwykłych sygnałów Unix oraz innych pseudo sygnałów Bash
RETURN
iDEBUG
.źródło
Oto sposób, aby to zrobić:
źródło
exit 1
to wszystko czego potrzebujesz. Jest1
to kod powrotu, więc możesz go zmienić, jeśli chcesz, powiedzmy,1
oznaczać udany przebieg i-1
oznaczać awarię lub coś w tym rodzaju.źródło
test
lub&&
lub||
.