whereis 如何对其结果进行排序?

Ins*_*sOp 3 apt bash

运行时,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的文件/binwhich 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得到它的信息?

des*_*ert 5

我不太确定你是问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)

  • 别客气!`IFS=':' find $PATH ...` 与 `IFS=':' 不同;找到 $PATH ...`。注意分号的位置!后者将`IFS`设置为*shell变量*以影响*后续*命令中的变量扩展,而前者将`IFS`设置为新创建的`find`进程*之后*的*环境变量*同一命令中的其他变量被扩展。当然,您可以使用换行符代替分号。 (2认同)