$ PATH中的/ usr/bin和/ usr/local/bin等的顺序

Bru*_*uce 9 macos bash path

在我的Mac上,我经常使用bash.对于我的环境设置,我像往常一样添加/usr/bin/usr/local/bin进入$PATH.

虽然我确实知道什么/usr/bin/usr/local/bin有关,但我很好奇哪个应该按照惯例在另一个之前?那有什么特别的原因吗?

类似的是/usr/lib/usr/local/lib-希望的答案是相同或相似.

再多一点 - 只是原始问题的扩展,你将如何按照惯例在$ PATH中订购以下内容?为什么?

/bin
/sbin
/usr/bin
/usr/sbin
/usr/local/bin
/usr/local/sbin
/opt/local/bin
/opt/local/sbin
Run Code Online (Sandbox Code Playgroud)

Asa*_*aph 33

/usr/bin是操作系统提供的二进制文件的地方./usr/local/bin是用户提供的二进制文件的地方.在命令行上键入命令的名称时,shell将按顺序$PATH环境变量包含的路径中搜索所述命令.一个常见的模式是/usr/local/bin/usr/bin$PATH.这允许您安装备用版本的二进制文件,并让它们优雅地"覆盖"操作系统提供的二进制文件.操作系统更新不会破坏用户安装的软件包.这种模式在流行的Homebrew包管理器工具中特别用于OSX .

例如,在撰写本文时,OSX El Capitan提供git版本2.5.4(in /usr/bin).如果你想要一个更新的版本,你可以使用Homebrew来安装git版本2.7.0(into /usr/local/bin).由于/usr/local/bin之前/usr/bin$PATH环境变量中,当您git在shell中发出命令时,将使用较新的Homebrew版本.

在新的Mac上运行OSX El Capitan(我碰巧有一个),该/etc/paths文件包含以下内容:

/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
Run Code Online (Sandbox Code Playgroud)

它产生以下$PATH环境变量:

/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
Run Code Online (Sandbox Code Playgroud)

这与自制软件兼容.我建议坚持使用此OSX默认值.如果你真的想要包括/usr/local/sbin(在你上面的问题中列出),我会在上面提到它之前/usr/sbin出于类似的原因.至于/opt/local/bin/opt/local/sbin,我个人没有发现需要将它们添加到路径中,但似乎它们可能与它们的/usr/local类似物位于相似的位置,因为/opt传统上包含用户安装的二进制文件.

注:同样的解释适用于/usr/lib/usr/local/lib.

  • 我糊涂了。当我执行 `cat /etc/paths` 时,我得到:`/usr/local/bin`、`/usr/bin` 等。但是,当我`echo $PATH` 时,我得到:`/usr/bin:/bin/:` 等,这是完全不同的顺序。(我应该提到这是在优胜美地 10.10 上) (2认同)
  • @Binarian 用户应用程序只需向 .bashrc 添加别名即可达到相同的效果。不,将 /usr/loca/bin 放在 /usr/bin 之后无法保护您免于运行恶意 sudo。 (2认同)