运行时,whereis apt我得到一个如下所示的结果集:
apt: /usr/bin/apt /usr/lib/apt /etc/apt /usr/share/man/man8/apt.8.gz
Run Code Online (Sandbox Code Playgroud)
当我然后运行时,which apt我得到
/usr/bin/apt
Run Code Online (Sandbox Code Playgroud)
这是上面命令的第一个结果。我在这里读到这不是巧合,它与$PATH变量有关。所以我跑了echo $PATH,得到:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Run Code Online (Sandbox Code Playgroud)
然后我触摸了一个名为aptin的文件/bin并which apt再次运行- 没有发生任何变化,虽然whereis apt更改为:
apt: /usr/bin/apt /usr/lib/apt /bin/apt /etc/apt /usr/share/man/man8/apt.8.gz
Run Code Online (Sandbox Code Playgroud)
这让我得出结论,$PATH环境可能不是一切?有人可以阐明这个问题吗?从哪里whereis得到它的信息?
我不太确定你是问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
Run Code Online (Sandbox Code Playgroud)
不像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"
Run Code Online (Sandbox Code Playgroud)
它在每个目录中搜索PATH名为 的可执行文件SEARCH,例如apt:
$ which apt
/usr/bin/apt
$ IFS=':'; find $PATH -mindepth 1 -maxdepth 1 -type f -executable -name "apt"
/usr/bin/apt
Run Code Online (Sandbox Code Playgroud)
默认情况下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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
392 次 |
| 最近记录: |