"whereis" 和 "which" 在 Mac OS X 中返回不同的路径

jct*_*tim 30 path macports which macos

我有默认的 OpenSSL 9.8 (Mac OS X 10.6.8) 并决定通过 MacPorts ( sudo port install openssl)安装最新版本 (1.0.1 )。

这些是whichwhereis命令的控制台输出:

$ whereis openssl
/usr/bin/openssl
Run Code Online (Sandbox Code Playgroud)

(这是默认系统的一个)

$which openssl
/opt/local/bin/openssl
Run Code Online (Sandbox Code Playgroud)

(这是通过 MacPorts 安装的)

$ openssl version
OpenSSL 1.0.1c 10 May 2012
Run Code Online (Sandbox Code Playgroud)

(PATH中有mac端口的版本)

为什么为whereisand返回了不同的路径which,这可以吗?有什么办法可以得到相同的结果吗?

slh*_*hck 34

在 的联机帮助页中whereis,它清楚地说明(强调我的):

whereis 实用程序检查指定程序的标准二进制目录,打印出它找到的任何路径。

搜索的路径是 sysctl(8) 实用程序为“user.cs_path”字符串返回的字符串

与此相反,which是通常用于检查二进制文件在用户路径中的位置的工具。

which 实用程序获取命令名称列表并搜索每个可执行文件的路径,这些文件将在实际调用这些命令时运行。

这也解释了你的区别,因为/opt/local/bin不是全系统的“标准”路径-毕竟,MacPorts的是一个完全可选的安装和sysctl只有/usr/bin:/bin:/usr/sbin:/sbin在其user.cs_path每默认。

一般来说,坚持whichwhich -a寻找二进制文件而不是使用whereis.


理论上你可以user.cs_path通过改变

sysctl -w user.cs_path=/opt/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
Run Code Online (Sandbox Code Playgroud)

但我不知道这是否是个好主意。