# ¿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](http://www.gnu.org/software/libc/manual/html_node/Exit-Status.html) 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](http://tldp.org/LDP/abs/html/exitcodes.html) de [Advanced Bash Scripting Guide](http://tldp.org/LDP/abs/html/) se publica una tabla que muestra el uso y significado de los estados de salida empleados por BASH:

```plaintext
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`.

```c
#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.
