登录到 shell 会话是否会在永远不会更新的路径上构建可执行文件的缓存?

登录到 shell 会话是否会在永远不会更新的路径上构建可执行文件的缓存?

/usr/bin我注意到,当我编译存储在eg中的打包程序的自定义版本时/usr/bin/emacswhich emacs显示了已经存在的可执行文件,尽管/usr/bin/emacs发生在我的./usr/local/bin/emacs/usr/local/binPATH

我需要登录并注销,或者在显示新的二进制文件screen之前打开一个新框架。which emacs

这是因为某些缓存,还是存在某些安全功能导致在再次登录之前引用现有路径?

编辑

对于那些认为此问题重复或由其他问题回答的人,例如 -如何清除 Bash 的可执行文件路径缓存?,hash命令的目的是什么?,这个问题专门询问 a shell,而不是 about bash,或hash内置的命令bash(我不知道),尽管它是大多数系统上的默认 shell。

还存在其他外壳,例如zsh我使用的外壳fishksh以及许多其他新外壳,例如即将上市的外壳eshellkshoilshell

所以我认为这个问题应该是独立的,与一般的 shell 相关,而不是与某个特定的 shell 相关。

如果有这样做的理由,经验告诉我们这是明智的选择,或者它与经济或性能有关,而不是其他答案可能详细阐述的。

我更希望此编辑成为评论,但它们的长度有限。

答案1

是的,bash 和其他 shell 维护一个“哈希”命令表,它通过尝试 PATH 变量中的所有内容来查找该命令,因此不必每次都进行检查。像您一样对环境进行更改的人会发现该命令hash -d NAME很有用,或者hash -r.这些是 bash 命令,其他 shell 的操作可能有所不同。

所以,

hash -d emacs

会要求 bash 忘记 emacs 路径,并且

hash -r

会要求它忘记全部路径。我倾向于使用后者。

相关内容