Significato dell'uscita 0, dell'uscita 1 e dell'uscita 2 in uno script bash

25

Sto facendo alcuni esercizi pratici.

  

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=
   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

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

    
posta andrej benedičič 13.03.2017 - 16:15

3 risposte

36

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'uso del codice di uscita appropriato non è un requisito e non è applicato dalla shell. Gli sviluppatori possono ignorare la guida se pensano che sia saggio.

    
risposta data user535733 13.03.2017 - 16:20
19

Usare exit e un numero è un modo pratico per segnalare il risultato del tuo script. Imita il modo in cui i comandi di bash emettono un codice di ritorno. Con i comandi bash il codice di ritorno 0 di solito significa che tutto è stato eseguito correttamente senza errori. exit fa sì che lo script interrompa l'esecuzione in quel punto e ritorni 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 ogni comando dovrebbe essere possibile trovare della documentazione che indichi cosa significa ogni codice restituito.

Puoi ottenere il codice di ritorno dell'ultimo comando bash usando la variabile di 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 interrogare il codice di ritorno nello stesso modo quando è in esecuzione. Quindi vedrai che avendo:

exit 2
exit 0

È praticamente privo di significato, poiché non puoi mai raggiungere la parte exit 0 .

    
risposta data Arronical 13.03.2017 - 16:24
4

Tutto da solo, exit implica un valore di uscita pari a zero o il completamento corretto del tuo script. Non è necessario aggiungere l'argomento zero al comando exit per indicare il completamento corretto. Lo script potrebbe (o probabilmente lo farà) uscire correttamente anche se verifica una condizione errata. In questo caso lo vuoi specificamente uscire 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 comando exit nell'ultima riga non deve necessariamente essere lì. Potrebbe essere chiamato con lo zero o non chiamato affatto. Senza specificare l'argomento 1 per il comando exit, la risposta in tutti questi casi alla echo $? sarebbe zero.

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

    
risposta data geekasaurus 13.03.2017 - 21:04

Leggi altre domande sui tag