Codigos de stderr $? [Solucionado]

Antes no le había prestado tanta atención, pero ahora me intriga y además lo necesito. Hablo del valor de retorno que imprime la variable de entorno $?. Por ejemplo si ejecutamos un programa y estando activo oprimimos ^C y luego tecleamos echo $? nos dira un numero, en este caso el 130, o por ejemplo si escribimos un comando que no existe nos imprimirá el numero 127, si se trata de un script que hicimos y sale algo mal entonces nos devolverá otro valor, usualmente el 1, sin embargo programando en C me he encontrado con algunos valores extraños que nunca había visto como el 2,4 etc. Se que son desde el 1 hasta el 255 pero en realidad existe alguna manera de saber que significa cada valor de estos?
Les agradeceria su ayuda.
Saludos.

Pues yo hace un buen tiempo estuve aprendiendo un poco de acerca de bash, no se si es a eso lo que te refieres, mira que encontré esta información la cual me pareció interesante entre tantos manuales que busqué:

La variable $ en Linux

En bash la variable $? almacena el resultado de la última operación realizada en el sistema. No hay mas que abrir una consola, lanzar algún comando y ejecutar echo $?. Si el resultado es 0 la aplicación ejecutada tuvo éxito, pero si es distinto de 0 es porque hubo algún error.

Por ejemplo el listado de un directorio es siempre exitoso:

joaquin.arias@62cm:~$ls
joaquin.arias@62cm:~$echo $?
0

Pero si intentamos listar archivos que no existen:

joaquin.arias@62cm:~$ls *.pñm
joaquin.arias@62cm:~$echo $?
2

Su uso es fundamental en bash o en cualquier otro lenguaje de consola de Linux, porque la interacción con otros comandos del sistema es contínua.


Poco le entendí pero parece que es algo de lo que mencionas, no lo se, ojalá te sirva tongue

xanderboy escribió:

Pues yo hace un buen tiempo estuve aprendiendo un poco de acerca de bash, no se si es a eso lo que te refieres, mira que encontré esta información la cual me pareció interesante entre tantos manuales que busqué:

La variable $ en Linux

En bash la variable $? almacena el resultado de la última operación realizada en el sistema. No hay mas que abrir una consola, lanzar algún comando y ejecutar echo $?. Si el resultado es 0 la aplicación ejecutada tuvo éxito, pero si es distinto de 0 es porque hubo algún error.

Por ejemplo el listado de un directorio es siempre exitoso:

joaquin.arias@62cm:~$ls
joaquin.arias@62cm:~$echo $?
0

Pero si intentamos listar archivos que no existen:

joaquin.arias@62cm:~$ls *.pñm
joaquin.arias@62cm:~$echo $?
2

Su uso es fundamental en bash o en cualquier otro lenguaje de consola de Linux, porque la interacción con otros comandos del sistema es contínua.


Poco le entendí pero parece que es algo de lo que mencionas, no lo se, ojalá te sirva tongue

Si xander, gracias por la ayuda pero lo de echo $? ya lo se, ese precisamente es mi problema. Cada vez que ejecuto un programa que hago yo en C, o otro lenguaje siempre procedo a ejecutar echo $? posteriormente en vista a saber el valor de retorno, si es 0 se que todo esta bien, y si es 1 se que algo anda mal, pero a veces me retorna el valor 3 o 4 o algun otro. Como explicaba en el inicio, si ejecutas un comando inexistente te retornara el codigo de error 130 o 127 ahora no me acuerdo y asi sucede con cada programa que es ejecutado: un valor es retornado e imprimido en consola por la variable de entorno $?, pero yo lo que necesito es saber el significado de cada valor de estos. Recuerda que son 255 valores distintos. O sea que si un programa despues de ejecutado no te devuelve el valor de 0, no deberias conformate con saber que algo anda mal pues no necesariamente retorna 1, puede retornar el 123 y entonces que es lo que anda mal?
Agradeceria la ayuda del foro en esto.

Neo escribió:

O sea que si un programa despues de ejecutado no te devuelve el valor de 0, no deberias conformate con saber que algo anda mal pues no necesariamente retorna 1, puede retornar el 123 y entonces que es lo que anda mal?
Agradeceria la ayuda del foro en esto.

Ya ahora si comprendí ... A bueno, eso no lo se, pero creo que ahora se entiende el punto exacto de tu consulta [Que por cierto muy pero muy interesante la consulta]

Ojalá como dices que alguien con más experiencia en el caso pueda resolver la duda en cuestión. Saludos wink

Hola, aquí tienes un punto de partida (en güispikinglis):

http://www.museum.state.il.us/ismdepts/library/linuxguides/abs-guide/exi...

jsa_ escribió:

Hola, aquí tienes un punto de partida (en güispikinglis):

http://www.museum.state.il.us/ismdepts/library/linuxguides/abs-guide/exitcodes.html

Gracias amigo pero el proxy mio no me deja pasar a esta pagina. Te agradezco de todas maneras. Y si la lista no es muy larga y decides ponerla en el hilo para complementarlo mejor te lo agradeceria mucho mas.
Saludos.

Te pego la tabla de errores

  • 1 catchall for general errors let "var1 = 1/0" miscellaneous errors, such as "divide by zero"
  • 2 misuse of shell builtins, according to Bash documentation Seldom seen, usually defaults exit code 1
  • 126 command invoked cannot execute permission problem or command is not an executable
  • 127 "command not found" possible problem with $PATH or a typo
  • 128 invalid argument to exit exit 3.14159 exit takes only integer args in the range 0 - 255
  • 128+n fatal error signal "n" kill -9 $PPIDof script $? returns 137 (128 + 9)
  • 130 script terminated by Control-C Control-C is fatal error signal 2, (130 = 128 + 2, see above)
  • 255 exit status out of range exit -1 exit takes only integer args in the range 0 - 255

EDITADO: guau que implicación, borro el mío que me ha quedado mucho peor. pueden borrar este comentario.

Sin problema, Neo. Por lo que he leído por ahí, parece que no existe una lista como tal, y que queda en poder de los programadores definir que significa cada código para su programa. He visto un ejemplo por ahí con el kill.

Creo que esto más o menos lo explica, si necesitas seguir algún otro enlace te lo pego aquí también.

Un saludo

Appendix C. Exit Codes With Special Meanings

Table C-1. "Reserved" Exit Codes
Exit Code Number Meaning Example Comments
1 catchall for general errors let "var1 = 1/0" miscellaneous errors, such as "divide by zero"
2 misuse of shell builtins, according to Bash documentation Seldom seen, usually defaults to exit code 1
126 command invoked cannot execute permission problem or command is not an executable
127 "command not found" possible problem with $PATH or a typo
128 invalid argument to exit exit 3.14159 exit takes only integer args in the range 0 - 255
128+n fatal error signal "n" kill -9 $PPIDof script $? returns 137 (128 + 9)
130 script terminated by Control-C Control-C is fatal error signal 2, (130 = 128 + 2, see above)
255 exit status out of range exit -1 exit takes only integer args in the range 0 - 255

According to the table, exit codes 1 - 2, 126 - 165, and 255 have special meanings, and should therefore be avoided as user-specified exit parameters. Ending a script with exit 127 would certainly cause confusion when troubleshooting (is the error a "command not found" or a user-defined one?). However, many scripts use an exit 1 as a general bailout upon error. Since exit code 1 signifies so many possible errors, this might not add any additional ambiguity, but, on the other hand, it probably would not be very informative either.

There has been an attempt to systematize exit status numbers (see /usr/include/sysexits.h), but this is intended mostly for C and C++ programmers. It would be well to support a similar standard for scripts. The author of this document proposes restricting user-defined exit codes to the range 64 - 113 (in addition to 0, for success), to conform with the C/C++ standard. This would still leave 50 valid codes, and make troubleshooting scripts more straightforward.

All user-defined exit codes in the accompanying examples to this document now conform to this standard, except where overriding circumstances exist, as in Example 9-2.

Note

Issuing a $? from the command line after a shell script exits gives results consistent with the table above only from the Bash or sh prompt. Running the C-shell or tcsh may give different values in some cases.

No significa nada en particular.

Lo estandar es que un programa que termino correctamente retorne un valor cero, cuando se trata de un error común para el programa, por ejemplo hacer cat de un archivo que no existe, lo estandar es retornar un 1 o un -1, de lo contrario se retorna un valor diferente a cero que depende exclusivamente de lo que el programador haya definido para el estado en que se encontraba el programa cuando terminó.

Los valores extravagantes, por ejemplo un -45558573 por lo general los retornan los runtime para errores no manejados por el programa que se estaba ejecutando.

--- EDITO ---

La tabla de errores que postearon los demás foreros es para bash (/bin/bash) pero, como decía, cada programa puede tener su interpretación. Si a alguien se le ocurre que una salida de error retorna 0 pues así será

--- EDITO 2 ---
Bash en particular nunca retorna un valor muy alto, la salida de error está limitada a 1 byte, pero con otras shells puede ser diferente

Ale, ya la tienes por triplicado para que se la pases a algún amigo meparto