127 Código de retorno de $?

291

¿Cuál es el significado del valor de retorno 127 de $? en UNIX

Sachin Chourasiya
fuente

Respuestas:

428

El valor 127 se devuelve /bin/shcuando el comando dado no se encuentra dentro de la PATHvariable 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.

Vieja escuela
fuente
55
Esto también sucede si un script bash no tiene el modo "+ x" pero sí existe.
MatthewKremer
3
Puede intentar usar 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.
four43
10
@ cr125rider, whichno 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.
Charles Duffy
55
Esto también me sucedió con un archivo que tenía avances de línea de Windows. La corrección de los finales de línea a formato Unix resolvió el problema
Mitkins
44
@MatthewKremer: En realidad, obtengo 126( Permission denied), no 127cuando 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).
mklement0
58

Generalmente significa:

127 - comando no encontrado

pero también puede significar que se encuentra el comando ,
pero NO se encuentra una biblioteca requerida por el comando .

okigan
fuente
14

127 - command not found

ejemplo: $ caat El mensaje de error aparecerá

intento:

caat: comando no encontrado

ahora revisas usando echo $?

Anitha Mani
fuente
10

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.
apbianco
fuente
8

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.

falstro
fuente
2

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.

Rama Sastry
fuente
1

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');
Mella
fuente
Gracias, esto funcionó para mí. Entonces hice qué gs y luego usé la ruta de salida en mi script. Trabajó ..
Juan
0

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.

Codificador inteligente
fuente