“找不到命令”和“没有这样的文件或目录”之间的区别?


33

例如:

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

有什么不同?在这两种情况下,nodefoo无效的命令,但它似乎像Unix那样只是找不到node二进制?例如node,在卸载程序时,有没有办法清理它,以便获得

$ node
-bash: node: command not found

编辑:

type命令结果:

$ type node
node is hashed (/usr/local/bin/node)
$ type foo
-bash: type: foo: not found

您可以同时使用type node和的输出来更新您的问题吗type foo(尽管可能只有第一个确实有用)。
埃里克·雷诺夫

@EricRenouf,好吧,我做到了。
gwg

2
可能是“节点”是/ usr / bin / node-> / usr / local / bin / node中的符号链接,后者不可用,因此错误,这表明/ usr / local / bin / node已删除创建符号链接后。
likewhoa

Answers:


59

那是因为bash记住了您的命令位置,将其存储在哈希表中。

卸载后node,哈希表不会被清除,bash仍然认为node是在/usr/local/bin/node,跳过PATH查找,然后/usr/local/bin/node使用直接调用execve()。由于node不再存在时,execve()将返回ENOENT错误,表示没有此类文件或目录,bash将错误报告给您。

在中bash,您可以从哈希表中删除条目:

hash -d node

或删除整个哈希表(适用于所有POSIX shell):

hash -r

2
请注意,并不一定要/usr/local/bin/node丢失它。如果该文件是动态链接的可执行文件,并且缺少依赖项之一,则您将收到相同的“无此文件或目录”消息。在您尝试ldd该文件之前,这可能会使您发疯。
Guntram Blohm

@GuntramBlohm,但是在某些Linux发行版中,对bash进行了修补,以打印更易理解的错误消息,例如progname: error while loading shared libraries: badLib.so.1: cannot open shared object file: No such file or directory(或者在特定情况下不是bash,而是ld-linux.so)。
Ruslan

@Ruslan以我的经验,如果缺少“普通”共享库,就会遇到“加载共享库时出错”,如果缺少动态链接器本身,则会遇到莫名其妙的“没有这样的文件或目录” 。当您意识到前一种情况是动态链接程序检测到,而后一种情况是由内核检测到的时,这很有意义,对于动态链接程序来说,打印出有用的消息(execve写入stderr作为失败的副作用)要容易得多。可能会违反POSIX等)
zwol

@zwol啊,对,这就是某些发行版(例如CentOS)补丁bash的目的。然后,此类修补程序版本会显示诸如的错误/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory
Ruslan

-6

我在Ubuntu Linux 16.04上发现“没有这样的文件或目录”意味着您必须切换当前的工作目录,而“找不到命令”则意味着您必须使用apt-get install xxxyyy_zzz来解决此问题。


10
如果您的cwd对将发现的内容没有任何影响(除非您以./为前缀),则PATH的设置是相当不安全的。找不到命令并不总是要解决的问题:)
rackandboneman
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.