/usr/bin
我注意到,当我编译存储在eg中的打包程序的自定义版本时/usr/bin/emacs
,which emacs
显示了已经存在的可执行文件,尽管/usr/bin/emacs
发生在我的./usr/local/bin/emacs
/usr/local/bin
PATH
我需要登录并注销,或者在显示新的二进制文件screen
之前打开一个新框架。which emacs
这是因为某些缓存,还是存在某些安全功能导致在再次登录之前引用现有路径?
编辑:
对于那些认为此问题重复或由其他问题回答的人,例如 -如何清除 Bash 的可执行文件路径缓存?,hash命令的目的是什么?,这个问题专门询问 a shell
,而不是 about bash
,或hash
内置的命令bash
(我不知道),尽管它是大多数系统上的默认 shell。
还存在其他外壳,例如zsh
我使用的外壳fish
,ksh
以及许多其他新外壳,例如即将上市的外壳eshell
。ksh
oilshell
所以我认为这个问题应该是独立的,与一般的 shell 相关,而不是与某个特定的 shell 相关。
如果有这样做的理由,经验告诉我们这是明智的选择,或者它与经济或性能有关,而不是其他答案可能详细阐述的。
我更希望此编辑成为评论,但它们的长度有限。
答案1
是的,bash 和其他 shell 维护一个“哈希”命令表,它通过尝试 PATH 变量中的所有内容来查找该命令,因此不必每次都进行检查。像您一样对环境进行更改的人会发现该命令hash -d NAME
很有用,或者hash -r
.这些是 bash 命令,其他 shell 的操作可能有所不同。
所以,
hash -d emacs
会要求 bash 忘记 emacs 路径,并且
hash -r
会要求它忘记全部路径。我倾向于使用后者。