
Quiero saber qué valores de retorno podemos usar que no se confundan con, por ejemplo. ¿FIRMA?
ex.:
$sleep 10
$#hit ctrl+c
$echo $?
130
entonces sé que no debo usar nada como return 130
oexit 130
entonces esto sería engañoso:
$function FUNC(){ return 130; };FUNC;echo $?
130
Respuesta1
El estado de salida de un proceso se codifica como un valor.entre 0 y 255, eso es todo lo que puedes usar como código de salida. Si pasa un valor fuera de ese rango, la mayoría de los shells usan el módulo restante 256. Algunos shells permiten un rango más amplio de valores enteros para funciones.
La única regla para los códigos de salida es que0 significa éxito y cualquier otro valor significa fracaso. Esta regla va más allá de Unix: también es una convención común en otros sistemas operativos (incluidos DOS, Windows y muchos sistemas integrados que tienen una noción de código de salida, pero VMS hace las cosas de manera diferente). En los sistemas Unix, está integrado en las construcciones booleanas del shell ( if
, while
, &&
, ||
, !
, set -e
, ...), en make
y seguido de todas las utilidades estándar. En los programas POSIX C,EXIT_SUCCESS
es 0 y EXIT_FAILURE
es algún valor distinto de cero (normalmente 1).
No existe ninguna regla (de facto o de jure) con respecto a la elección de los códigos de salida en caso de falla. Sólo unas pocas utilidades POSIX exigen códigos de estado de falla específicos:
- El
!
operador de shell devuelve 1 si su operando devuelve 0. El operador&&
y||
pasa el estado del último comando. cmp
ydiff
devuelve 1 para archivos diferentes y ≥2 para condiciones de error.expr
devuelve 1 si la expresión se evalúa como cero o nula, 2 para una expresión no válida y ≥3 para otros errores.grep
devuelve 1 para "no encontrado" y ≥2 para condiciones de error. Muchos comandos de búsqueda siguen a esto (pero nofind
, que devuelve 0 si ningún archivo coincide).mesg
devuelve 0 para sí, 1 para no y ≥2 para error.patch
devuelve 1 si se rechazó un trozo y ≥2 para otros errores.sort -c
devuelve 1 si los datos del archivo no están ordenados y ≥2 en caso de errores.compress
ylocaledef
defina algunos valores pequeños para errores específicos.
Existe una idea común, pero no universal, de que valores más elevados significan peores fracasos. Para los comandos que prueban una condición booleana como grep
(¿está presente este patrón?) y diff
(¿son idénticos estos archivos?), 1 significa “no” y los valores más altos indican un error. Además,los valores a partir de 126 rara vez se utilizan, tal como están integrados en el shell (y los comandos POSIX command
, env
, nice
y ):nohup
time
- 126 y 127 indican una falla al invocar un comando externo;
- los valores superiores a 128 in
$?
indican un comando que fue terminado por una señal.
/usr/include/sysexits.h
enumera algunos valores con sus significados, pero es de sendmail y nunca lo he visto fuera de programas que no estén relacionados con la entrega de correo electrónico.
En resumen, devuelva 0 en caso de éxito y 1 o 2 en caso de error. Si necesita distinguir entre casos de falla, comience en 1 y aumente el valor para fallas peores.
Respuesta2
Convenciones de estado de salida
Técnicamente, puede utilizar cualquier valor entre 0 y 255. Sin embargo, existen varias convenciones que puede utilizar:
- Código de salida 1 comocomodín para errores generales.
- Códigos de salida 64-78 desysexits.hpara indicar la clase de error. Generalmente puedes buscarlos en/usr/include/sysexits.h, que se instala mediante el paquete libc6-dev de Debian/Ubuntu.
- códigos de salida deerrno.h. También puedes buscarlos con elerrnocomando del paquete moreutils. En mi sistema, la ejecución
errno --list
actualmente muestra 134 errores definidos.
Documento y visualización
En general, es una buena idea documentar los códigos de salida utilizados en su secuencia de comandos, o al menos qué convención está siguiendo. También puede resultar útil mostrar un mensaje distintivo antes de salir, como por ejemplo:
# using sysexits.h
echo "EX_USAGE: invalid argument: $1" > /dev/stderr
exit 64
# using errno.h
echo "ENOENT: File not found: $file" > /dev/stderr
exit 2
Respuesta3
Puede utilizar cualquier número entre 0 y 255 exceptocódigos de salida reservados(Haga clic aquí para saber más)