GNU/Linux >> Linux Esercitazione >  >> Linux

Cosa significa set -e in uno script bash?

Da help set :

  -e  Exit immediately if a command exits with a non-zero status.

Ma è considerata una cattiva pratica da alcuni (autori di bash FAQ e irc freenode #bash FAQ). Si consiglia di utilizzare:

trap 'do_something' ERR

per eseguire do_something funzione quando si verificano errori.

Vedi http://mywiki.wooledge.org/BashFAQ/105


set -e interrompe l'esecuzione di uno script se un comando o una pipeline presenta un errore, che è l'opposto del comportamento predefinito della shell, che consiste nell'ignorare gli errori negli script. Digita help set in un terminale per vedere la documentazione per questo comando integrato.


Come per bash - The Set Builtin manual, if -e /errexit è impostato, la shell esce immediatamente se una pipeline costituita da un singolo comando semplice, un elenco o un comando composto restituisce uno stato diverso da zero.

Per impostazione predefinita, lo stato di uscita di una pipeline è lo stato di uscita dell'ultimo comando nella pipeline, a meno che pipefail l'opzione è abilitata (è disabilitata per impostazione predefinita).

In tal caso, lo stato di ritorno della pipeline dell'ultimo comando (quello più a destra) per uscire con uno stato diverso da zero o zero se tutti i comandi escono correttamente.

Se desideri eseguire qualcosa all'uscita, prova a definire trap , ad esempio:

trap onexit EXIT

dove onexit è la tua funzione per fare qualcosa all'uscita, come sotto che sta stampando la semplice traccia dello stack:

onexit(){ while caller $((n++)); do :; done; }

Esiste un'opzione simile -E /errtrace che intrappolerebbe invece su ERR, ad esempio:

trap onerr ERR

Esempi

Esempio di stato zero:

$ true; echo $?
0

Esempio di stato diverso da zero:

$ false; echo $?
1

Esempi di negazione dello stato:

$ ! false; echo $?
0
$ false || true; echo $?
0

Prova con pipefail disabilitato:

$ bash -c 'set +o pipefail -e; true | true | true; echo success'; echo $?
success
0
$ bash -c 'set +o pipefail -e; false | false | true; echo success'; echo $?
success
0
$ bash -c 'set +o pipefail -e; true | true | false; echo success'; echo $?
1

Prova con pipefail in corso di attivazione:

$ bash -c 'set -o pipefail -e; true | false | true; echo success'; echo $?
1

Ho trovato questo post mentre cercavo di capire quale fosse lo stato di uscita per uno script interrotto a causa di un set -e . La risposta non mi sembrava ovvia; da qui questa risposta. Fondamentalmente, set -e interrompe l'esecuzione di un comando (ad es. uno script di shell) e restituisce il codice dello stato di uscita del comando che ha avuto esito negativo (ovvero lo script interno, non lo script esterno) .

Ad esempio, supponiamo di avere lo script di shell outer-test.sh :

#!/bin/sh
set -e
./inner-test.sh
exit 62;

Il codice per inner-test.sh è:

#!/bin/sh
exit 26;

Quando eseguo outer-script.sh dalla riga di comando, il mio script esterno termina con il codice di uscita dello script interno:

$ ./outer-test.sh
$ echo $?
26

Linux
  1. Cosa fa "exec {fd}/watchdog" in Bash?

  2. Cosa significa `:-` in uno script di shell?

  3. Cosa significa e commerciale alla fine di una riga di script di shell?

  4. Cosa significano -s e [[]] in una condizione if in Bash?

  5. Cosa significa questo avviso?

Cosa significa chmod 777

Cosa significa "-" (doppio trattino)?

Cosa significa essere "sh compatibile"?

Nessuna variabile DISPLAY X11 - cosa significa?

Cosa fa -e in un bash shebang?

Cosa significa echo $? fare?