Sono confuso sul significato del codice di uscita alla fine di uno script bash: conosco quel codice di uscita 0 significa che è terminato correttamente e che ci sono molti più numeri di codici di uscita (127 se non sbaglio?)
La mia domanda riguarda quando si vede il codice di uscita 0 alla fine di uno script, non forza il codice di uscita come 0 anche se lo script non è riuscito o ha un altro significato?
Commenti
Risposta
Il comando incorporato exit
esce dalla shell (da Bash “s riferimento ):
exit [n]
Esci dalla shell, restituendo lo stato n al genitore della shell. Se n viene omesso, lo stato di uscita è quello dellultimo comando eseguito. Qualsiasi trap su EXIT viene eseguito prima che la shell termini.
Anche la corsa alla fine del file esce, restituendo il codice di ritorno dellultimo comando, quindi sì, un exit 0
finale farà uscire lo script con lo stato di successo indipendentemente dallo stato di uscita di i comandi precedenti. (ovvero, supponendo che lo script raggiunga il exit
.) Alla fine di uno script puoi anche utilizzare true
o per ottenere un codice di uscita pari a zero.
Ovviamente più spesso si” usa exit
dallinterno di un if
per terminare lo script a metà.
Dovrebbero stampare un 1 ($?
contiene il codice di uscita restituito dal comando precedente) :
sh -c "false" ; echo $? sh -c "false; exit" ; echo $?
Anche se dovrebbe stampare uno 0:
sh -c "false; exit 0" ; echo $?
Io “no sicuro se il concetto di script “non riuscito” durante lesecuzione di un exit
ha senso, poiché è possibile che alcuni comandi eseguiti dallo script falliscano, ma lo script stesso abbia successo . Spetta allautore dello script decidere cosa è un successo e cosa no.
Inoltre, lintervallo standard per i codici di uscita è 0..255. I codici superiori a 127 sono usati dalla shell per indicare un processo terminato da un segnale, ma possono essere restituiti nel solito modo. La chiamata di sistema wait
restituisce effettivamente un valore più ampio, con il resto contenente bit di stato impostati dal sistema operativo.
Commenti
- Fantastico, ' non conoscevo la numerazione dei codici di uscita a 8 bit. Grazie!
- Tieni presente che quando un processo viene terminato, non esce con un codice di uscita > 127. ' è solo che alcune shell impostano
$?
su 128 + signum in questo caso. Vedi Codice di uscita predefinito al termine del processo? per i dettagli. -
exit 0
restituirà solo 0, se luscita viene eseguita. (potrebbe uscire da un percorso diverso).
Risposta
0 significa successo, numeri interi positivi significa fallimento. Ci sono 255 diversi codici di errore, ma i valori 126 e superiori sono riservati per indicare che un programma non può “t essere avviato (126 o 127) o è stato interrotto da un segnale (129 e superiore). Vedere Codice di uscita predefinito al termine del processo? e Quali valori di ritorno / uscita posso utilizzare nelle funzioni / script bash? per ulteriori informazioni.
Lo stato di uscita di uno script di shell è lo stato di uscita dellultimo comando eseguito dallo script. Quindi, ad esempio
#!/bin/sh somecommand
restituisce lo stato di uscita di somecommand
, mentre
#!/bin/sh somecommand exit 0
restituisce 0 indipendentemente da cosa somecommand
restituito.Questo secondo script può anche essere scritto
#!/bin/sh somecommand true
Mettere exit 0
alla fine di uno script non “t necessariamente causa restituisce 0. Ciò fa sì che restituisca 0 solo quando viene raggiunta la fine dello script. Ad esempio, il seguente script restituisce sempre 3:
#!/bin/sh exit 3 exit 0
Il anche il seguente script restituisce sempre un codice di errore, oltre a visualizzare un messaggio su un errore di sintassi:
#!/bin/sh } exit 0
Lo script seguente restituisce 1 o 0 a seconda del suo primo argomento:
#!/bin/sh if [ "$1" = "foo" ]; then exit 1 fi exit 0
Lo script seguente restituisce lo stato di somecommand
, poiché set -e
fa terminare lo script se somecommand
non riesce:
#!/bin/sh set -e somecommand exit 0
exit 0
, uscirà con il codice di uscita 0 indipendentemente da ciò che accade allinterno dello script.exit 0
, uscirà con il codice 0 solo se è stata eseguita lultima istruzione. Lunico impatto diexit 0
alla fine dello script è di restituire 0 invece dello stato dellistruzione precedente.exit 0
in qualsiasi momento, restituirà il codice di uscita 0 indipendentemente da ciò che è accaduto prima.