¿Diferencia entre "comando no encontrado" y "no existe tal archivo o directorio"?

33

Por ejemplo:

$ node
-bash: /usr/local/bin/node: No such file or directory
$ foo
-bash: foo: command not found

¿Cual es la diferencia? En ambos casos, nodey fooson comandos no válidos, pero parece que Unix simplemente no puede encontrar el nodebinario? Al desinstalar un programa, por ejemplo node, ¿hay alguna manera de limpiar esto para que pueda

$ node
-bash: node: command not found

EDITAR:

Resultados del typecomando:

$ type node
node is hashed (/usr/local/bin/node)
$ type foo
-bash: type: foo: not found
gwg
fuente
¿Puede actualizar su pregunta con la salida de ambos type nodey type foo(aunque probablemente solo el primero sea realmente útil).
Eric Renouf
@EricRenouf, está bien, lo hice.
gwg
2
Es probable que 'nodo' sea un enlace simbólico de / usr / bin / node -> / usr / local / bin / node y este último no esté disponible, por lo tanto, el error, que sugeriría / usr / local / bin / node fue eliminado después de que se creó el enlace simbólico.
likewhoa

Respuestas:

59

Eso es porque bashrecordó la ubicación de su comando, guárdelo en una tabla hash .

Después de la desinstalación node, la tabla hash no se borra, bashtodavía piensa que nodeestá en /usr/local/bin/node, omitiendo la PATHbúsqueda y llamando /usr/local/bin/nodedirectamente, usando execve(). Dado que cuando nodeya no existe, execve()devuelve el ENOENTerror, significa que no hay tal archivo o directorio, le bashinformó ese error.

En bash, puede eliminar una entrada de la tabla hash:

hash -d node

o elimine la tabla hash completa ( funciona en todos los shell POSIX ):

hash -r
Cuonglm
fuente
2
Tenga en cuenta que no tiene que ser lo /usr/local/bin/nodeque falta; si ese archivo es un ejecutable vinculado dinámicamente y falta una de las dependencias, recibirá el mismo mensaje "No existe tal archivo o directorio". Esto puede volverte loco hasta que pruebes lddese archivo.
Guntram Blohm apoya a Monica el
@GuntramBlohm pero en algunas distribuciones de Linux bash está parcheado para imprimir mensajes de error más comprensibles, como progname: error while loading shared libraries: badLib.so.1: cannot open shared object file: No such file or directory(o podría no ser bash en este caso en particular, pero ld-linux.so).
Ruslan
@Ruslan En mi experiencia, obtiene el "error al cargar bibliotecas compartidas" si falta una biblioteca compartida "ordinaria" y el inexplicable "No existe tal archivo o directorio" si falta el enlazador dinámico . Esto tiene sentido cuando se da cuenta de que el primero de los casos se detecta por el enlazador dinámico, mientras que el último caso es detectado por el kernel, y es mucho más fácil para el enlazador dinámico para imprimir un mensaje útil ( execveescrito a stderr como efecto secundario en caso de fallo probablemente violaría POSIX o algo así)
zwol
@zwol ah, cierto, eso es lo que hacen algunas parcelas de distros (por ejemplo, CentOS). Tal versión parcheada luego imprime errores como /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory.
Ruslan
-6

En Ubuntu Linux 16.04 encontré que "No existe tal archivo o directorio" significa que debe cambiar su directorio de trabajo actual, mientras que "comando no encontrado" significa que debe usar apt-get install xxxyyy_zzz para solucionar el problema.

Franco
fuente
10
Si su cwd tiene alguna influencia sobre lo que se encontrará o no (a menos que lo prefiera con ./), su RUTA se configura de una manera bastante insegura. Y un comando que no se encuentra no siempre es un problema que desea solucionar :)
rackandboneman