Saltar al contenido

¿Cómo obtengo la lista de códigos de salida (y / o códigos de retorno) y el significado de un comando / utilidad?

Solución:

No existe una “receta” para obtener el significado de un estado de salida de un comando de terminal dado.

Mi primero intento sería la página de manual:

[email protected]:~# man ls 
   Exit status:
       0      if OK,

       1      if minor problems (e.g., cannot access subdirectory),

       2      if serious trouble (e.g., cannot access command-line argument).

Segundo: Google. Vea wget como ejemplo.

Tercera: Los estados de salida del shell, por ejemplo, bash. Bash y sus incorporaciones pueden usar valores superiores a 125 especialmente. 127 para comando no encontrado, 126 para comando no ejecutable. Para obtener más información, consulte los códigos de salida de bash.

Los códigos de salida indican una condición de falla al finalizar un programa y se encuentran entre 0 y 255. El shell y sus elementos incorporados pueden usar especialmente los valores superiores a 125 para indicar modos de falla específicos, por lo que la lista de códigos puede variar entre los shells y los sistemas operativos (por ejemplo, Bash utiliza el valor 128 + N como estado de salida). Consulte: Bash – 3.7.5 Estado de salida o man bash.

En general un cero estado de salida indica que un comando triunfado, un no cero el estado de salida indica falla.

Para comprobar qué código de error devuelve el comando, puede imprimir $? para el último código de salida o ${PIPESTATUS[@]} que proporciona una lista de valores de estado de salida de la canalización (en Bash) después de que sale un script de shell.

No existe una lista completa de todos los códigos de salida que se pueden encontrar, sin embargo, se ha intentado sistematizar los números de estado de salida en el código fuente del kernel, pero esto está destinado principalmente a los programadores de C / C ++ y un estándar similar para la creación de scripts podría ser apropiado.

En /usr/include/sysexits.h (o: man sysexits en BSD):

0   /* successful termination */
64  /* base value for error messages */
64  /* command line usage error */
65  /* data format error */
66  /* cannot open input */
67  /* addressee unknown */
68  /* host name unknown */
69  /* service unavailable */
70  /* internal software error */
71  /* system error (e.g., can't fork) */
72  /* critical OS file missing */
73  /* can't create (user) output file */
74  /* input/output error */
75  /* temp failure; user is invited to retry */
76  /* remote error in protocol */
77  /* permission denied */
78  /* configuration error */
/* maximum listed value */

La lista anterior asigna códigos de salida no utilizados previamente del 64 al 78. La gama de códigos de salida no asignados se restringirá aún más en el futuro.

Sin embargo, los valores anteriores se usan principalmente en sendmail y casi nadie más, por lo que no son ni remotamente cercanos a un estándar (como lo señala @Gilles).

En shell, el estado de salida es el siguiente (basado en Bash):

  • 1125 – El comando no se completó correctamente. Consulte la página de manual del comando para conocer el significado del estado, algunos ejemplos a continuación:

  • 1 – Catchall para errores generales

    Errores varios, como “dividir por cero” y otras operaciones no permitidas.

    Ejemplo:

    $ let "var1 = 1/0"; echo $?
    -bash: let: var1 = 1/0: division by 0 (error token is "0")
    1
    
  • 2 – Uso indebido de elementos integrados de shell (según la documentación de Bash)

    Falta palabra clave o comando, o problema de permisos (y código de retorno diferencial en una comparación de archivos binarios fallida).

    Ejemplo:

     empty_function() {}
    
  • 6 – No existe tal dispositivo o dirección

    Ejemplo:

    $ curl foo; echo $?
    curl: (6) Could not resolve host: foo
    6
    
  • 124 – el comando se agota

  • 125 – si un comando en sí mismo fallaver: coreutils
  • 126 – si se encuentra el comando pero no se puede invocar (por ejemplo, no es ejecutable)

    El problema de permisos o el comando no es ejecutable.

    Ejemplo:

    $ /dev/null
    $ /etc/hosts; echo $?
    -bash: /etc/hosts: Permission denied
    126
    
  • 127 – si no se puede encontrar un comando, el proceso hijo creado para ejecutarlo devuelve ese estado

    Posible problema con $PATH o un error tipográfico.

    Ejemplo:

    $ foo; echo $?
    -bash: foo: command not found
    127
    
  • 128 – Argumento no válido para exit

    exit toma solo argumentos enteros en el rango 0-255.

    Ejemplo:

    $ exit 3.14159
    -bash: exit: 3.14159: numeric argument required
    
  • 128254 – señal de error fatal “n” – el comando murió debido a la recepción de una señal. El código de señal se agrega a 128 (128 + SEÑAL) para obtener el estado (Linux: man 7 signal, BSD: man signal), algunos ejemplos a continuación:

  • 130 – comando terminado debido a que se presionó Ctrl-C, 130-128 = 2 (SIGINT)

    Ejemplo:

    $ cat
    ^C
    $ echo $?
    130
    
  • 137 – si se envía el comando KILL(9) señal (128 + 9), el estado de salida del comando de lo contrario

    kill -9 $PPID de guión.

  • 141SIGPIPE – escribir en una tubería sin lector

    Ejemplo:

    $ hexdump -n100000 /dev/urandom | tee &>/dev/null >(cat > file1.txt) >(cat > file2.txt) >(cat > file3.txt) >(cat > file4.txt) >(cat > file5.txt)
    $ find . -name '*.txt' -print0 | xargs -r0 cat | tee &>/dev/null >(head /dev/stdin > head.out) >(tail /dev/stdin > tail.out)
    xargs: cat: terminated by signal 13
    $ echo ${PIPESTATUS[@]}
    0 125 141
    
  • 143 – comando terminado por señal código 15 (128 + 15 = 143)

    Ejemplo:

    $ sleep 5 && killall sleep &
    [1] 19891
    $ sleep 100; echo $?
    Terminated: 15
    143
    
  • 255* – estado de salida fuera de rango.

    exit toma solo argumentos enteros en el rango 0-255.

    Ejemplo:

    $ sh -c 'exit 3.14159'; echo $?
    sh: line 0: exit: 3.14159: numeric argument required
    255
    

De acuerdo con la tabla anterior, los códigos de salida 1 – 2, 126 – 165 y 255 tienen significados especiales y, por lo tanto, deben evitarse para los parámetros de salida especificados por el usuario.

Tenga en cuenta que los valores de salida fuera de rango pueden generar códigos de salida inesperados (por ejemplo, la salida 3809 da un código de salida de 225, 3809% 256 = 225).

Ver:

  • Apéndice E. Códigos de salida con significados especiales en la guía avanzada de secuencias de comandos Bash
  • Escribiendo mejores scripts de shell – Parte 2 en Innovationsts

Tendrá que buscar en el código / documentación. Sin embargo, lo que más se acerca a una “estandarización” es errno.h

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *