whereis

whereis

运行时whereis apt我得到如下结果集:

apt: /usr/bin/apt /usr/lib/apt /etc/apt /usr/share/man/man8/apt.8.gz

当我跑步时which apt我得到

/usr/bin/apt

这是上述命令的第一个结果。我读到这里这不是巧合,它与变量有关$PATH。所以我运行echo $PATH并得到:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

然后我触摸了一个名为的文件apt并再次/bin运行which apt- 没有发生任何变化,尽管whereis apt改为:

apt: /usr/bin/apt /usr/lib/apt /bin/apt /etc/apt /usr/share/man/man8/apt.8.gz

这让我得出这样的结论:$PATH环境可能不是一切?有人能解释一下这个问题吗?whereis信息从哪里来的?

答案1

我不太确定您问的是whereis还是which,所以我只对这两个问题进行回答。

whereis

whereis 查找指定命令名称的二进制文件、源文件和手册文件。(…) [它] 尝试在标准 Linux 位置以及 和 指定的位置查找所需程序 $PATH$MANPATH(
…)
了解正在使用的路径的最简单方法是添加-l列表选项。
来源:man whereis

运行whereis -l以获取程序使用的路径列表。默认情况下,它会搜索二进制文件、源文件和手册文件,您可以使用-b-s-m选项更改该行为,例如

$ whereis -m apt
apt: /usr/share/man/man8/apt.8.gz
$ whereis -b apt
apt: /usr/bin/apt /usr/lib/apt /etc/apt

不像which(见下文)whereis 没有在搜索二进制文件时测试该文件是否可执行,这就是touch /bin/apt改变其输出的原因。

which

which 通过在 PATH 中搜索与参数名称匹配的可执行文件来返回路径名 (…)。
来源:man which

什么which

我认为它的作用与此命令which基本相同:find

IFS=':'; find $PATH -mindepth 1 -maxdepth 1 -type f -executable -name "SEARCH"

它会在每个目录中搜索PATH名为的可执行文件SEARCH,例如apt

$ which apt
/usr/bin/apt
$ IFS=':'; find $PATH -mindepth 1 -maxdepth 1 -type f -executable -name "apt"
/usr/bin/apt

你的尝试为何失败

默认情况下which仅打印第一的从目录中匹配PATH,即执行的文件。touch /bin/apt您确实创建了一个与名称约束匹配的文件,但您忘记使其可执行,并且您没有发出which输出all 匹配。让我们再试一次:

$ touch /bin/apt
$ chmod +x /bin/apt
$ which -a apt
/usr/bin/apt
/bin/apt
$ IFS=':'; find $PATH -mindepth 1 -maxdepth 1 -type f -executable -name "apt"
/usr/bin/apt
/bin/apt

相关内容