我的PATH中有/usr/bin,稍后在PATH中有dot(表示当前目录)。我在两个目录中有一个程序"abcxyz",/var/someother。如果我在/var/中的一个mate终端中,并键入某个荒谬的名称dgxuznk,那么bash会说:"bash:dgxuznk:commandnot found",正如你所期望的那样。如果我现在在/usr/bin中创建一个名为dgxuznk的链接,指向/someother中的程序,它也会运行该程序,正如您所期望的那样。但是,如果我现在删除该链接,它不再显示"未找到命令",而是显示"bash:/usr/bin/dgxuznk:No such file or directory"。就好像它记得以前在哪里找到它,并希望再次在/usr/bin下找到它一样。
更糟糕的是,如果我现在将/var/中的程序(我所在的位置)重命名为dgxuznk,并键入"dgxuznk",它仍然会抱怨"bash:/usr/bin/dgxuznk:No such file or directory",就好像它无法通过PATH中的/usr/bin来查看点并在当前目录中查找程序一样。
这只在Fedora 19吗?如何对其进行编程,使其通过搜索路径中的/usr/bin并找到当前目录点?
(提示:如果你想重现这个错误-在/usr/bin中找到程序之前,不要让它在当前目录中找到程序。)
bash
在内存中维护一个程序所在位置的散列,这样它就不必每次运行命令时都进行完整的路径查找。每个bash
会话都维护自己的哈希,但您可以使用内置的hash
命令对其进行操作。要查看散列中的内容,只需在没有参数的情况下运行它。要清除它,请使用hash -r
。在您的情况下,您只想用hash -d gdxuznk
删除dgxuznk
。
(您可能会问,如果找不到位置,bash
为什么不直接从哈希中删除一个条目。报告错误而不是返回路径查找可能是有充分理由的,也可能是一个bug或需要改进的地方。)