Significato di exit 0, exit 1 e exit 2 in uno script bash


49

Sto facendo alcuni esercizi.

Scrivi uno script a cui verrà assegnato un numero di mese come argomento e tradurrà questo numero in un nome di mese. Il risultato verrà stampato su stdout.

Ho fatto una soluzione:

#test for number of argument

if [ "$#" -eq 0 ] ; 
then
   echo -e "No argument."
   echo -e "Write a number between 1 and 12."
   exit 1
elif [ "$#" -gt 1 ] ;
then
   echo -e "More than 1 argument."
   echo -e "Write a number between 1 and 12."
   exit 1
else

   numb=$1
   case "$numb" in
      1) echo "Month: January";;
      2) echo "Month: February";;
      3) echo "Month: March";;
      4) echo "Month: April";;
      5) echo "Month: May";;
      6) echo "Month: June";;
      7) echo "Month: July";;
      8) echo "Month: August";;
      9) echo "Month: September";;
     10) echo "Month: October";;
     11) echo "Month: November";;
     12) echo "Month: December";;
      *) echo -e "You wrote a wrong number. Try again with writing number between 1 and 12.";;

   esac
fi
exit 2
exit 0

Cosa significano exit 1, exit 0e cosa exit 2significano e perché li usiamo?


5
Un codice eseguito correttamente dovrebbe uscire con il codice 0. Altri valori indicano un errore. Vedi ad esempio Codici di uscita con significati speciali
V. Olsen

2
Uno script bash è come un cinema, ce ne sono diversi. Le istruzioni di uscita contrassegnano la posizione delle uscite per l'interprete bash. Quando lo script viene attivato, l'interprete deve eseguire fino all'uscita più vicina.
Depresso

5
Se questo è il codice che hai scritto, come mai hai usato dichiarazioni che non capisci nemmeno?
Dmitry Grigoryev il

5
1) Hai accettato una risposta subito dopo aver pubblicato la domanda. Dagli 24 ore per aspettare risposte ancora migliori. 2) La risposta accettata è sbagliata e fuorviante. La risposta corretta è "non esiste un significato predefinito per i codici di uscita (oltre 0 = successo); tu come sviluppatore di script definisci la semantica". 3) Se hai creato quello script, perché hai aggiunto i comandi di uscita (che sono logicamente superflui o potrebbero collassare a "exit 1" poiché usi if-else comunque).
AnoE

Risposte:


58

Ecco un buon riferimento per i codici di uscita della shell :

Exit code 0        Success
Exit code 1        General errors, Miscellaneous errors, such as "divide by zero" and other impermissible operations
Exit code 2        Misuse of shell builtins (according to Bash documentation)        Example: empty_function() {}

Avvertenza: l'utilizzo del codice di uscita corretto non è un requisito e non è applicato dalla shell. Gli sviluppatori possono ignorare la guida se la pensano saggia.


8
Stai attento, però. Il significato di un codice di uscita dipende interamente dagli sviluppatori del programma.
muru,

Inoltre, mentre l'origine collegata, la Guida di scripting Advanced Bash, afferma di mostrare " Codici di uscita riservati " (enfasi nell'originale), tale affermazione è sia unificata che totalmente falsa .
Eliah Kagan,

23

L'uso di exitun numero è un modo pratico per segnalare l'esito del tuo script. Imita il modo in cui i comandi bash generano un codice di ritorno. Con i comandi bash il codice di ritorno 0 di solito significa che tutto è stato eseguito correttamente senza errori. exitfa anche interrompere l'esecuzione dello script in quel punto e torna alla riga di comando.

Qualsiasi codice di ritorno maggiore di 0 indica un errore di qualche tipo, sebbene a volte l'errore non sia critico, per ciascun comando dovrebbe essere possibile trovare della documentazione che indichi il significato di ciascun codice di ritorno.

Puoi ottenere il codice di ritorno dell'ultimo comando bash usando la variabile shell in questo $?modo:

$ echo "something"
something
$ echo $?
0
$ cp
cp: missing file operand
Try 'cp --help' for more information.
$ echo $?
1

Quando lo si utilizza in uno script, è possibile eseguire una query sul codice di ritorno allo stesso modo al termine dell'esecuzione. Quindi vedrai che avere:

exit 2
exit 0

È in qualche modo insignificante, poiché non puoi mai raggiungere la exit 0parte.


3

Tutto da solo, exitimplica un valore di uscita pari a zero o il completamento corretto dello script. Non è necessario aggiungere l'argomento zero al comando exit per indicare il completamento corretto. Il tuo script potrebbe (o probabilmente verrà) chiuso correttamente anche se verifica una condizione errata. In questo caso, si desidera specificamente che esca con la condizione di errore (o 1).

echo -e "Enter numbers 1-4" \c"
read NUM
case $NUM in 
    1) echo "one";;
    2) echo "two";;
    3) echo "three";;
    4) echo "four";;
    *) echo "invalid answer"
       exit 1;;
esac

Il exitcomando nell'ultima riga non deve essere affatto lì. Potrebbe essere chiamato con lo zero o non essere chiamato affatto. Senza specificare l'argomento 1 per il comando exit, la risposta in tutti questi casi a echo $?sarebbe zero.

Tuttavia, specificando l'argomento 1 al comando di uscita, la risposta echo $?sarebbe 1. Quindi utilizzare l'argomento 1 al comando di uscita quando si desidera specificare che lo script è uscito con una condizione di errore.

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.