GNU/Linux >> Linux Esercitazione >  >> Linux

Interruzione di uno script di shell se qualsiasi comando restituisce un valore diverso da zero

Aggiungi questo all'inizio dello script:

set -e

Ciò causerà l'uscita immediata della shell se un semplice comando termina con un valore di uscita diverso da zero. Un comando semplice è qualsiasi comando che non fa parte di un test if, while o until, o parte di un &&o || lista.

Vedi la pagina man di bash(1) sul comando interno "set" per maggiori dettagli.

Personalmente inizio quasi tutti gli script di shell con "set -e". È davvero fastidioso che uno script continui ostinatamente quando qualcosa fallisce nel mezzo e infrange i presupposti per il resto dello script.


Se hai bisogno di pulizia all'uscita, puoi anche usare 'trap' con lo pseudo-segnale ERR. Funziona allo stesso modo dell'intrappolamento di INT o di qualsiasi altro segnale; bash genera ERR se un comando termina con un valore diverso da zero:

# 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

Oppure, specialmente se stai usando "set -e", potresti intercettare EXIT; la tua trappola verrà quindi eseguita quando lo script termina per qualsiasi motivo, inclusa una fine normale, interruzioni, un'uscita causata dall'opzione -e, ecc.


Le istruzioni if ​​nel tuo esempio non sono necessarie. Fallo in questo modo:

dosomething1 || exit 1

Se segui il consiglio di Ville Laurikari e usi set -e allora per alcuni comandi potresti aver bisogno di usare questo:

dosomething || true

Il || true farà in modo che la pipeline dei comandi abbia un true restituisce il valore anche se il comando fallisce quindi il -e l'opzione non ucciderà lo script.


Per aggiungere alla risposta accettata:

Tieni presente che set -e a volte non basta, specialmente se hai le pipe.

Ad esempio, supponi di avere questo script

#!/bin/bash
set -e 
./configure  > configure.log
make

... che funziona come previsto:un errore in configure interrompe l'esecuzione.

Domani farai un cambiamento apparentemente banale:

#!/bin/bash
set -e 
./configure  | tee configure.log
make

... e ora non funziona. Questo è spiegato qui e viene fornita una soluzione alternativa (solo Bash):

#!/bin/bash
set -e 
set -o pipefail

./configure  | tee configure.log
make

Linux
  1. Shell Script Wrapper per impedire l'esecuzione di comandi senza argomenti?

  2. Lo script della shell si blocca sul comando di posta?

  3. Utilizzando il comando passwd dall'interno di uno script di shell

  4. Come memorizzare un comando in una variabile in uno script di shell?

  5. Script bash:utilizzo del comando script da uno script bash per la registrazione di una sessione

Comprendere facilmente i comandi della shell utilizzando lo script "Explain Shell" in Linux

Come eseguire il comando / script della shell di Linux in background

Come memorizzare un comando Linux come variabile nello script della shell

Come eseguire un comando in uno script della shell?

Comando Linux per verificare se uno script di shell è in esecuzione o meno

Esegui uno script di shell dal comando docker-compose, all'interno del contenitore