![whereis](https://linux22.com/image/898318/whereis.png)
运行时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
输出a
ll 匹配。让我们再试一次:
$ 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