我现在似乎无法重现它,但似乎我添加到 /usr/local/bin 的一些程序被添加到/usr/local/sbin
.
我之所以注意到这一点,是因为我编写了一个 bash 脚本,但当时我不明白为什么,当我在终端中运行它时,它根本无法执行。我使用whereas
并找到了一份旧副本,其中所有内容均已注释掉/usr/local/sbin
。从 中删除文件后,当我在命令行中运行.../sbin
中的工作脚本时,它就会执行。.../bin
beforewhereis
中列出的文件的输出。为什么脚本优先?另外,知道为什么该文件被复制到吗?在意识到问题之前,我可能在试图解决问题时多次将“bin”输入为“sbin”,但我发现这不太可能。bin
sbin
sbin
sbin
答案1
据我所知,没有任何发行版具有任何可以复制您放入的任何脚本的机制,/usr/local/bin
反之亦然/usr/local/sbin
。
您是否知道它bash
会缓存已执行命令的路径名,并且有时您需要使用该hash
命令来刷新该缓存?
如果您在将工作版本添加到 之前尝试了没有显式路径的脚本命令/usr/local/bin
,则 shell 会在 中找到注释掉的版本/usr/local/sbin
,为其缓存该路径名,并在会话的其余部分记住它。即使将工作版本添加到 后/usr/local/bin
,该 shell 会话也会继续使用该/usr/local/sbin
版本,除非您运行hash <scriptname>
(仅重做路径搜索<scriptname>
)或hash -r
(刷新该 shell 会话的整个路径缓存)。
如果命令不再存在于散列位置中,shell 还将自动重新运行对先前散列命令的完整搜索,这解释了为什么/usr/local/sbin/<scriptname>
删除后会恢复预期行为。
whereis
不是 shell 的内部命令,因此它对 的内部路径缓存bash
一无所知。bash
如果我的理论是正确的,该type <scriptname>
命令(类似于whereis
但内置于bash
)将报告:
<scriptname> is hashed (/usr/local/sbin/<scriptname>)
要触发您遇到的行为,首先将脚本的注释版本复制到/usr/local/sbin
,然后在 中尚不存在脚本版本时尝试在没有显式路径的情况下运行它一次就足够了/usr/local/bin
。这将只需要使 bin -> sbin 拼写错误一次。