为什么 which 和 whereis 提供不同的位置以及我怎样才能选择一条路径而不是另一条路径?

为什么 which 和 whereis 提供不同的位置以及我怎样才能选择一条路径而不是另一条路径?

我最近编译并安装了 diffutils-3.3,因为我需要diff--no-dereference所包含版本中没有的开关。 之后configure,,,,,,,make新版本 3.3 的 diff 安装在了中。make checkmake cleaninstall/usr/local/bin

运行diff --version结果与安装前相同3.2。

命令及其输出如下:

$ which diff
/usr/local/bin/diff

$ whereis -b diff
diff: /usr/bin/diff /usr/bin/X11/diff /usr/local/bin/diff

$ echo $PATH
/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

使用完整路径,我可以确认 diff 版本 3.3 在/usr/local/bin,而版本 3.2 在/usr/bin

查看路径,我期望由于/usr/local/bin首先出现,所以diff当我不带路径调用时应该执行该特定操作diff。显然事实并非如此。我的问题是为什么以及我该怎么做才能获得所需的结果?

注意:Ubuntu 12.04.5

$ uname -a
Linux me-AOD270 3.2.0-80-generic #116-Ubuntu SMP Mon Mar 23 17:11:32 UTC 2015 i686 i686 i386 GNU/Linux

答案1

该问题的根本原因是 bash 查找表中的缓存(散列)条目。bash对命令路径进行散列以避免昂贵的查找。

感谢@muru 为我指明了正确的方向。我解决问题的方法是使用export $PATH$对我有用的命令。

type进一步的研究表明,您可以使用命令- (在我的情况下)找出路径是否被缓存(散列),type diff该命令返回类似于命令的完整路径diff is /usr/bin/diff

您可以采取外科手术方法,使用命令删除单个命令的缓存(哈希)hash -d *command*,或者在我的情况下hash -d diff,使用输出报告成功bash: hash: diff: not found

您还可以采用不太优雅但同样成功的方法,即转储hash -r不报告任何内容的整个缓存(哈希)表。

资料来源:

经验

如何摆脱-bash:/usr/{package}:没有此文件或目录

https://unix.stackexchange.com/questions/5609/how-do-i-clear-bashs-cache-of-paths-to-executables

相关内容