¿Hay algún estándar de estados de salida en Linux?

¿Hay algún estándar de estados de salida en Linux?

Todos sabemos que si un proceso termina con éxito en Linux siempre lo hace usando 0 como estado de salida. Mientras que en caso de error, dicho valor debe estar comprendido entre 1 y 255. Pero ¿existe algún estándar respecto del estado de salida que se debe utilizar en función de la causa del error?

Obviamente, esta no es una pregunta que a uno le venga alegremente a la cabeza. Ayer estaba corrigiendo prácticas y todas las “inspiradas” en la misma fuente tenían la costumbre de usar estados de salida curiosamente altos: 127, 128, etc. Así que obviamente a alguien se le ocurrió preguntarme ¿de verdad esto tiene que ser así? ¿Para terminar a causa de este error concreto tengo que utilizar exit(128) o puedo emplear cualquier otro valor?

Exit Status en el manual de GNU libc

El manual de la librería del sistema en Linux comenta que cualquier valor entre 0 y 255 es válido, con la salvedad de que:

  • 0 siempre indica que no hubo error.

  • Cualquier valor diferente indica que sí lo hubo.

Sin embargo, como algunos sistemas no POSIX puede usar una convención diferente, el manual recomienda utilizar las macros EXIT_SUCCESS —0 en los sistemas POSIX— y EXIT_FAILURE —1 en los sistemas POSIX—. También comenta que, por lo general, valores superiores a 127 se reservan para propósitos especiales, recomendando emplear el valor 128 para indicar un fallo en la ejecución de un programa en un subproceso.

Estados de salida de BASH

En el apéndice E de Advanced Bash Scripting Guide se publica una tabla que muestra el uso y significado de los estados de salida empleados por BASH:

1:     Catchall for general errors

2:     Misuse of shell builtins (according to Bash documentation)

126:   Command invoked cannot execute

127:   "command not found"

128:   Invalid argument to exit (exit takes only integer args in
       the range 0 - 255)

128+n: Fatal error signal "n"

255:   Exit status out of range (exit takes only integer args in
       the range 0 - 255)

Esta tabla puede ser útil para tener alguna idea acerca de los estados de salida adecuados para nuestros propios scripts de BASH y además nos puede servir de guía cuando programamos nuestras propias aplicaciones en otros lenguajes.

Archivo sysexits.h en C y C++

La comunidad ha intentado sistematizar el uso y la interpretación de los estados de salida cuando se desarrolla en C y C++, siendo muchos los programas que siguen esta recomendación, aunque nunca se haya estandarizado. Estos estados de salida recomendados, junto con su significado, están disponibles en el archivo /usr/include/sysexits.h.

#define EX_OK           0   /* successful termination */

#define EX__BASE        64  /* base value for error messages */

#define EX_USAGE        64  /* command line usage error */
#define EX_DATAERR      65  /* data format error */
#define EX_NOINPUT      66  /* cannot open input */
#define EX_NOUSER       67  /* addressee unknown */
#define EX_NOHOST       68  /* host name unknown */
#define EX_UNAVAILABLE  69  /* service unavailable */
#define EX_SOFTWARE     70  /* internal software error */
#define EX_OSERR        71  /* system error (e.g., can't fork) */
#define EX_OSFILE       72  /* critical OS file missing */
#define EX_CANTCREAT    73  /* can't create (user) output file */
#define EX_IOERR        74  /* input/output error */
#define EX_TEMPFAIL     75  /* temp failure; user is invited to retry */
#define EX_PROTOCOL     76  /* remote error in protocol */
#define EX_NOPERM       77  /* permission denied */
#define EX_CONFIG       78  /* configuration error */

#define EX__MAX         78  /* maximum listed value */

Si la causa del error en nuestro programa encaja en alguna de las anteriores, podemos usar las macros definidas. En caso contrario, podemos utilizar los valores anteriores al 64 y posteriores al 78 para definir nuestros propios estados de salida.