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

25

Estoy haciendo algunos ejercicios de práctica.

  

Escribe un guión al que se le asignará un número de mes como argumento y traducirá este número en el nombre de un 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=
   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

¿Qué significan exit 1, exit 0 y exit 2 y por qué los utilizamos?

    
pregunta andrej benedičič 13.03.2017 - 15:15

3 respuestas

36

Aquí hay una buena referencia para los códigos de salida del 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 correcto no es un requisito y el caparazón no lo impone. Los desarrolladores pueden ignorar la guía si lo consideran prudente.

    
respondido por el user535733 13.03.2017 - 15:20
19

Usar exit y 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 dan salida a un código de retorno. Con los comandos bash, el código de retorno 0 generalmente significa que todo se ejecutó correctamente sin errores. exit también hace que el 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 indique qué significa cada código de retorno.

Puedes obtener el código de retorno del último comando bash usando la variable de shell $? como así:

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

Cuando usa esto en una secuencia de comandos, puede consultar el código de retorno de la misma manera cuando termina de ejecutar. Entonces verá que tiene:

exit 2
exit 0

No tiene ningún sentido, ya que nunca se puede llegar a la parte exit 0 .

    
respondido por el Arronical 13.03.2017 - 15:24
4

Por sí solo, exit implica un valor de salida de cero o la finalización exitosa de su secuencia de comandos. No es necesario agregar el argumento cero al comando de salida para indicar que se completó correctamente. Su secuencia de comandos puede (o probablemente lo hará) salir con éxito, aunque prueba una condición errónea. En este caso, específicamente desea que salga 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 comando exit en la última línea no tiene que estar allí en absoluto. Podría llamarse con el cero o no llamarse en absoluto. Sin especificar el argumento 1 para el comando de salida, la respuesta en todos estos casos al echo $? sería cero.

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

    
respondido por el geekasaurus 13.03.2017 - 20:04

Lea otras preguntas en las etiquetas