Codice di uscita alla fine di uno script bash

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

  • Se uno script termina con exit 0, uscirà con il codice di uscita 0 indipendentemente da ciò che accade allinterno dello script.
  • @Hatclock why didn ' Non pubblichi la tua risposta come una risposta completa? come commento non posso contrassegnarla e non ' penso che tu riceva punti internet falsi per rispondere (giusto?) Solo un pensiero. .. (complimenti per la risposta veloce)
  • Io ' sono in una stazione ferroviaria sul mio telefono, non Non mi piace scrivere troppo sul mio telefono. ilkkachu sembra avere una buona risposta però!
  • @Hatclock No, per niente. Se uno script termina con exit 0, uscirà con il codice 0 solo se è stata eseguita lultima istruzione. Lunico impatto di exit 0 alla fine dello script è di restituire 0 invece dello stato dellistruzione precedente.
  • @Gilles Questo era più ambiguo risposta formulata da parte mia. Se uno script esegue exit 0 in qualsiasi momento, restituirà il codice di uscita 0 indipendentemente da ciò che è accaduto prima.

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 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *