Significado de la salida 0, la salida 1 y la salida 2 en un script bash

49

Estoy haciendo algunos ejercicios de práctica.

Escriba un guión que recibirá un número de mes como argumento y traducirá este número en un nombre de mes. El resultado se imprimirá en stdout.

Hice una solución:

#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

Lo que hacemos exit 1, exit 0y exit 2entendemos, y por qué las usamos?

andrej benedičič
fuente
55
Un código ejecutado con éxito debe salir con el código 0. Otros valores indican un error. Ver por ejemplo Códigos de salida con significados especiales
V. Olsen
2
Un guión bash es como una sala de cine, existen diferentes. Las declaraciones de salida marcan la ubicación de las salidas para el intérprete bash. Cuando se dispara el guión, se requiere que el intérprete corra hasta la salida más cercana.
Deprimido Daniel
55
Si este es el código que ha escrito, ¿por qué ha usado declaraciones que ni siquiera entiende?
Dmitry Grigoryev
55
1) Usted aceptó una respuesta justo después de publicar la pregunta. Déle 24 horas para esperar respuestas aún mejores. 2) La respuesta aceptada es incorrecta y engañosa. La respuesta correcta es "no hay un significado predeterminado para los códigos de salida (más allá de 0 = éxito); usted, como desarrollador de scripts, define la semántica". 3) Si creó esa secuencia de comandos, ¿por qué agregó los comandos de salida?
AnoE

Respuestas:

58

Aquí hay una buena referencia para los códigos de salida de 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() {}

Advertencia: el uso del código de salida adecuado no es un requisito y el shell no lo exige. Los desarrolladores pueden ignorar la guía si lo consideran prudente.

usuario535733
fuente
8
Pero ten cuidado. Lo que significa un código de salida depende totalmente de los desarrolladores del programa.
Muru
Además, si bien la fuente vinculada, la Guía avanzada de secuencias de comandos Bash, afirma mostrar " Códigos de salida reservados " (énfasis en el original), esa afirmación es a la vez no citada y completamente falsa .
Eliah Kagan
23

Usar exity un número es una forma práctica de señalar el resultado de su secuencia de comandos. Imita la forma en que los comandos bash generan un código de retorno. Con los comandos bash, el código de retorno 0 generalmente significa que todo se ejecutó correctamente sin errores. exittambién hace que su script detenga la ejecución en ese punto y regrese a la línea de comando.

Cualquier código de retorno mayor que 0 indica un error de algún tipo, aunque a veces el error no es crítico, para cada comando debería ser posible encontrar alguna documentación que le diga qué significa cada código de retorno.

Puede obtener el código de retorno del último comando bash utilizando la variable de shell de esta $?manera:

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

Cuando usa esto en un script, puede consultar el código de retorno de la misma manera cuando termina de ejecutarse. Entonces verás que tener:

exit 2
exit 0

No tiene sentido, ya que nunca puedes llegar a la exit 0parte.

Arronico
fuente
3

Por sí solo, exitimplica un valor de salida de cero, o la finalización exitosa de su script. No tiene que agregar el argumento cero al comando de salida para indicar la finalización exitosa. Su script puede (o probablemente lo hará) salir con éxito, aunque prueba una condición errónea. En este caso, desea que salga específicamente con la condición de error (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

El exitcomando en la última línea no tiene que estar allí en absoluto. Se podría llamar con el cero o no llamarlo en absoluto. Sin especificar el argumento 1 para el comando de salida, la respuesta en todos estos casos echo $?sería cero.

Sin embargo, al especificar el argumento 1 para el comando de salida, la respuesta echo $?sería 1. Entonces, use el argumento 1 para el comando de salida cuando desee especificar que el script ha salido con una condición de error.

geekasaurus
fuente