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

gwg*_*gwg 33 command-line bash executable

例如:

$ node
-bash: /usr/local/bin/node: No such file or directory
$ foo
-bash: foo: command not found
Run Code Online (Sandbox Code Playgroud)

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

$ node
-bash: node: command not found
Run Code Online (Sandbox Code Playgroud)

编辑:

type命令的结果:

$ type node
node is hashed (/usr/local/bin/node)
$ type foo
-bash: type: foo: not found
Run Code Online (Sandbox Code Playgroud)

cuo*_*glm 60

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

卸载后node,哈希表没有清除,bash仍然认为node是 at /usr/local/bin/node,跳过PATH查找,/usr/local/bin/node直接调用,使用execve(). 因为 whennode不再存在,execve()返回ENOENT错误,意味着没有这样的文件或目录,bash向您报告该错误。

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

hash -d node
Run Code Online (Sandbox Code Playgroud)

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

hash -r
Run Code Online (Sandbox Code Playgroud)

  • 请注意,它不一定是缺少的`/usr/local/bin/node`;如果该文件是动态链接的可执行文件,并且缺少其中一个依赖项,您将收到相同的“没有此类文件或目录”消息。这会让你发疯,直到你在那个文件上尝试 `ldd`。 (2认同)