GNU/Linux >> Znalost Linux >  >> Linux

Zrušení skriptu shellu, pokud jakýkoli příkaz vrátí nenulovou hodnotu

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

Linux
  1. Použití příkazu passwd ze skriptu shellu

  2. Jak uložit příkaz do proměnné v shell skriptu?

  3. Bash skript:Použití příkazu script z bash skriptu pro protokolování relace

  1. Jak předat argument v Expect přes příkazový řádek v shell skriptu

  2. návratová hodnota z python skriptu do shell skriptu

  3. Kde je v Ubuntu nastavena proměnná PATH?

  1. Shell Script Wrapper zabránit spuštění příkazu bez argumentů?

  2. Jak nastavit proměnnou prostředí v GDB pomocí příkazu shell?

  3. Spusťte skript prostředí z příkazu docker-compose uvnitř kontejneru