Codice di uscita alla fine di uno script bash


22

Sono confuso sul significato del codice di uscita alla fine di uno script bash: so che il codice di uscita 0 significa che è finito con successo e che ci sono molti più numeri di codici di uscita (127 se non sbaglio?)

La mia domanda riguarda il vedere il codice di uscita 0 alla fine di uno script, forza il codice di uscita come 0 anche se lo script ha esito negativo o ha un altro significato?


2
Se uno script termina con exit 0, uscirà con il codice di uscita 0 indipendentemente da ciò che accade all'interno dello script.
Hatclock,

@Hatclock perché non hai pubblicato la tua risposta come risposta a pieno titolo? come commento non posso contrassegnarlo, e non credo che si ottengano falsi punti Internet per la risposta (giusto?) Solo un pensiero ... (complimenti per la risposta veloce)
Busted

1
Sono in una stazione ferroviaria sul mio telefono, non mi piace molto scrivere troppo sul mio telefono. sembra che ilkkachu abbia una buona risposta!
Hatclock,


2
@Hatclock No, per niente. Se uno script termina con exit 0, uscirà con il codice 0 solo se l'ultima istruzione è stata eseguita. L'unico impatto exit 0alla fine dello script è di restituire 0 anziché lo stato dell'istruzione precedente.
Gilles 'SO- smetti di essere malvagio' il

Risposte:


22

Il comando incorporato exitesce dalla shell (dal riferimento di Bash ):

exit [n]
Esci dalla shell, restituendo lo stato n al genitore della shell. Se n viene omesso, lo stato di uscita è quello dell'ultimo comando eseguito. Qualsiasi trap su EXIT viene eseguito prima che la shell termini.

Anche l'esecuzione in esecuzione alla fine del file viene restituita, restituendo il codice di ritorno dell'ultimo comando, quindi sì, un finale exit 0farà uscire lo script con lo stato corretto indipendentemente dallo stato di uscita dei comandi precedenti. (Cioè, supponendo che lo script raggiunga il finale exit.) Alla fine di uno script puoi anche usare trueo :per ottenere un codice di uscita pari a zero.

Naturalmente più spesso useresti exitdall'interno e ifper terminare la sceneggiatura nel mezzo.

Dovrebbero stampare un 1 ( $?contiene il codice di uscita restituito dal comando precedente):

sh -c "false" ; echo $?
sh -c "false; exit" ; echo $?

Mentre questo dovrebbe stampare uno 0:

sh -c "false; exit 0" ; echo $?

Non sono sicuro che il concetto dello script "fallisca" quando si esegue un exitsenso ha senso, poiché è del tutto possibile che alcuni comandi eseguiti dallo script falliscano, ma lo script stesso ha esito positivo. Sta all'autore della sceneggiatura decidere cosa è successo e cosa no.

Inoltre, l'intervallo standard per i codici di uscita è 0..255. I codici sopra 127 sono usati dalla shell per indicare un processo terminato da un segnale, ma possono essere restituiti nel solito modo. La waitchiamata di sistema in realtà restituisce un valore più ampio, con il resto contenente bit di stato impostati dal sistema operativo.


Bene, non sapevo della numerazione dei codici di uscita a 8 bit. Grazie!
Rotto il

Si noti che quando un processo viene interrotto, non termina con un codice di uscita> 127. È solo che alcune shell impostate $?su 128 + signum in quel caso. Vedi Codice di uscita predefinito al termine del processo? per dettagli.
Stéphane Chazelas,

exit 0restituirà 0 solo se l'uscita viene eseguita. (potrebbe uscire da un percorso diverso).
ctrl-alt-delor,

18

0 significa successo, numeri interi positivi indicano fallimento. Esistono 255 codici di errore diversi, ma i valori 126 e successivi sono riservati per indicare che un programma non può essere avviato (126 o 127) o è stato ucciso da un segnale (129 e successivo). Vedi Codice di uscita predefinito al termine del processo? e quali valori di ritorno / uscita posso usare nelle funzioni / script bash? per maggiori informazioni.

Lo stato di uscita di uno script di shell è lo stato di uscita dell'ultimo comando eseguito dallo script. Quindi per esempio

#!/bin/sh
somecommand

restituisce lo stato di uscita di somecommand, mentre

#!/bin/sh
somecommand
exit 0

restituisce 0 indipendentemente da ciò che è stato somecommandrestituito. Questo secondo script potrebbe anche essere scritto

#!/bin/sh
somecommand
true

Mettere exit 0alla fine di uno script non comporta necessariamente la restituzione di 0. Questo lo fa restituire 0 solo quando viene raggiunta la fine dello script. Ad esempio, il seguente script restituisce sempre 3:

#!/bin/sh
exit 3
exit 0

Lo script seguente restituisce sempre anche un codice di errore, oltre a visualizzare un messaggio su un errore di sintassi:

#!/bin/sh
}
exit 0

Il seguente script restituisce 1 o 0 a seconda del suo primo argomento:

#!/bin/sh
if [ "$1" = "foo" ]; then
  exit 1
fi
exit 0

Il seguente script restituisce lo stato di somecommand, poiché set -eprovoca la chiusura dello script in caso di somecommanderrore:

#!/bin/sh
set -e
somecommand
exit 0
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.