¿Cuál es el significado del valor de retorno 127 de $? en UNIX
¿Cuál es el significado del valor de retorno 127 de $? en UNIX
Respuestas:
El valor 127 se devuelve /bin/sh
cuando el comando dado no se encuentra dentro de la PATH
variable del sistema y no es un comando de shell incorporado. En otras palabras, el sistema no entiende su comando, porque no sabe dónde encontrar el binario al que está intentando llamar.
which [program]
para ver qué binario está usando el sistema operativo. Si aparece vacío, el siguiente paso es verificar el bit de ejecución y la RUTA.
which
no es particularmente preciso: no sabe sobre alias, funciones de shell, memoria de búsqueda de RUTA u otros factores internos del estado de shell. Mucho mejor de usar type
, un shell incorporado que conoce todas esas cosas.
126
( Permission denied
), no 127
cuando intento invocar un archivo no ejecutable (independientemente de su contenido); Del mismo modo, un intento de ejecutar un directorio también da como resultado 126
( is a directory
).
127 - command not found
ejemplo: $ caat El mensaje de error aparecerá
intento:
caat: comando no encontrado
ahora revisas usando echo $?
Una convención de shell es que un ejecutable exitoso debe salir con el valor 0. Cualquier otra cosa puede interpretarse como una falla de algún tipo, por parte de bash o el ejecutable que acaba de ejecutar. Consulte también $ PIPESTATUS y la sección EXIT STATUS de la página de manual de bash:
For the shell’s purposes, a command which exits with a zero exit status has succeeded. An exit status of zero indicates success. A non-zero exit status indicates failure. When a command terminates on a fatal signal N, bash uses the value of 128+N as the exit status.
If a command is not found, the child process created to execute it returns a status of 127. If a com-
mand is found but is not executable, the return status is 126.
If a command fails because of an error during expansion or redirection, the exit status is greater than
zero.
Shell builtin commands return a status of 0 (true) if successful, and non-zero (false) if an error
occurs while they execute. All builtins return an exit status of 2 to indicate incorrect usage.
Bash itself returns the exit status of the last command executed, unless a syntax error occurs, in
which case it exits with a non-zero value. See also the exit builtin command below.
No tiene un significado especial, aparte de que el último proceso para salir lo hizo con un estado de salida de 127.
Sin embargo, también lo usa bash (suponiendo que esté usando bash como shell) para decirle que el comando que intentó ejecutar no se pudo ejecutar (es decir, no se pudo encontrar). Sin embargo, lamentablemente no es deducible de inmediato si el proceso salió con el estado 127 o si no se pudo encontrar.
EDITAR:
no es deducible de inmediato, excepto por la salida en la consola, pero esto es desbordamiento de pila, por lo que supongo que está haciendo esto en un script.
Este error también es a veces engañoso. Dice que el archivo no se encuentra a pesar de que los archivos están realmente presentes. Podría deberse a caracteres especiales ilegibles no válidos presentes en los archivos que podrían ser causados por el editor que está utilizando. Este enlace puede ayudarlo en tales casos.
-bash: ./my_script: / bin / bash ^ M: mal intérprete: No existe tal archivo o directorio
La mejor manera de averiguar si se trata de este problema es simplemente colocar una declaración de eco en todo el archivo y verificar si se produce el mismo error.
Si está intentando ejecutar un programa utilizando un lenguaje de script, es posible que deba incluir la ruta completa del lenguaje de script y el archivo a ejecutar. Por ejemplo:
exec('/usr/local/bin/node /usr/local/lib/node_modules/uglifycss/uglifycss in.css > out.css');
Si el JCL de mainframe de IBM tiene algunos caracteres o números adicionales al final del nombre del script de Unix que se está llamando, entonces puede arrojar dicho error.