Přidejte toto na začátek skriptu:
set -e
To způsobí okamžité ukončení shellu, pokud jednoduchý příkaz skončí s nenulovou výstupní hodnotou. Jednoduchý příkaz je jakýkoli příkaz, který není součástí příkazu if, while nebo till test nebo není součástí &&nebo || seznam.
Více podrobností naleznete na manuálové stránce bash(1) k internímu příkazu "set".
Osobně začínám téměř všechny shell skripty s "set -e". Je opravdu otravné, když skript tvrdošíjně pokračuje, když něco selže uprostřed a naruší předpoklady pro zbytek scénáře.
Pokud musíte provést vyčištění při ukončení, můžete také použít „past“ s pseudo-signálem ERR. Funguje to stejně jako zachycení INT nebo jiného signálu; bash vyvolá ERR, pokud některý příkaz skončí s nenulovou hodnotou:
# Create the trap with
# trap COMMAND SIGNAME [SIGNAME2 SIGNAME3...]
trap "rm -f /tmp/$MYTMPFILE; exit 1" ERR INT TERM
command1
command2
command3
# Partially turn off the trap.
trap - ERR
# Now a control-C will still cause cleanup, but
# a nonzero exit code won't:
ps aux | grep blahblahblah
Nebo, zvláště pokud používáte "set -e", můžete zachytit EXIT; vaše past se pak spustí, když se skript z jakéhokoli důvodu ukončí, včetně normálního konce, přerušení, ukončení způsobeného volbou -e atd.
Příkazy if ve vašem příkladu jsou zbytečné. Udělejte to takto:
dosomething1 || exit 1
Pokud přijmete radu Ville Laurikari a použijete set -e
pak pro některé příkazy možná budete muset použít toto:
dosomething || true
|| true
způsobí, že kanál příkazů bude mít true
vrátí hodnotu, i když příkaz selže, takže -e
volba nezabije skript.
Chcete-li přidat k přijaté odpovědi:
Mějte na paměti, že set -e
někdy nestačí, zvláště pokud máte trubky.
Předpokládejme například, že máte tento skript
#!/bin/bash
set -e
./configure > configure.log
make
... což funguje podle očekávání:chyba v configure
přeruší provádění.
Zítra provedete zdánlivě triviální změnu:
#!/bin/bash
set -e
./configure | tee configure.log
make
...a teď to nejde. Toto je vysvětleno zde a je poskytnuto řešení (pouze Bash):
#!/bin/bash set -e set -o pipefail ./configure | tee configure.log make