codes - shell exit




ExitCodes más grande que 255, posible? (2)

En caso afirmativo, ¿en qué sistema operativo, shell o lo que sea?

Considere el siguiente programa de Java (estoy usando Java como ejemplo, cualquier lenguaje sería bueno para esta pregunta, que trata más sobre los sistemas operativos):

public class ExitCode {
    public static void main(String args[]) {
        System.exit(Integer.parseInt(args[0]));
    }
}

Al ejecutarlo en Linux y bash, devuelve siempre valores menos iguales a 255, p. Ej. ( echo $? Imprime el código de salida del comando ejecutado anterior)

> java ExitCode 2; echo $?
2

> java ExitCode 128; echo $?
128

> java ExitCode 255; echo $?
255

> java ExitCode 256; echo $?
0

> java ExitCode 65536; echo $?
0

EDITADO: la (solo, hasta ahora) respuesta a continuación explica completamente lo que sucede en UNIXes. Todavía me estoy preguntando sobre otros sistemas operativos.


En Windows moderno, el sistema operativo en sí y el shell de consola predeterminado ( CMD.EXE ) aceptan y muestran códigos de salida en al menos todo el rango de enteros con signo de 32 bits. Ejecutando su ejemplo anterior en CMD.EXE proporciona los códigos de salida que solicitó:

> java ExitCode 2
> echo %errorlevel%
2

> java ExitCode 128
> echo %errorlevel%
128

> java ExitCode 255
> echo %errorlevel%
255

> java ExitCode 256
> echo %errorlevel%
256

> java ExitCode 65536
> echo %errorlevel%
65536

Windows realmente no tiene el concepto de señales Unix, ni intenta secuestrar el código de salida para agregar información adicional, por lo que siempre y cuando tu shell (o cualquier programa termine leyendo el código de salida) tampoco lo haga, deberías recuperar los códigos de salida que devolviste. Afortunadamente, los programas que utilizan el tiempo de ejecución de C de Microsoft (incluidos todos los programas compilados con MS Visual C ++) conservan el código de salida tal como está al salir de los procesos.


No es posible en Unix y derivados. La información de estado de salida devuelta consta de dos campos de 8 bits, uno que contiene el estado de salida y el otro que contiene información sobre la causa de la muerte (0 implica salida ordenada bajo control de programa, otros valores que indican que una señal lo mató e indicando si un núcleo fue abandonado).