在 Mac 上默认终端的 $PATH 位于哪里?

80

我已经在整个系统中寻找,但无法找到它。当我执行echo $PATH时,我得到我添加的内容以及默认路径。我没有.profile文件,但我有一个.bashrc文件,但默认路径不在其中。我正在寻找它只是想知道它的位置,因为所有的教程都解释说它位于.profile文件中...但如果你没有这个文件呢?那么它在哪里?有人有任何想法吗?

7个回答

124
如果您执行sudo man path_helper,它会稍微讲解一下如何组合路径。您可以查看/etc/paths/etc/paths.d。我就是这样做的,并找到了我想要的东西。

执行man path_helper命令时显示path_helper的手册不存在,但是编辑/etc/paths文件起作用了。 - Koen.
@Koen,尝试使用“sudo man path_helper”。我会修改条目。感谢您的提醒! - beOn
非常感谢您提供的帮助。这个提示帮助我解决了在OSX上Shell和Emacs之间$PATH配置不一致的烦人问题,请参见问题帖子 - Galder Zamarreño
3
我的路径中有很多东西没有被.zshenv或/etc/paths.d中的任何内容设置(/etc/paths不存在)。那现在怎么办? - Oscar
这个答案列出了其他可能性:https://superuser.com/a/1464744 - beOn

19

许多系统范围的设置,包括PATH,都是在/etc/profile中设置的,在启动时由bash读取。在Mac OS X上,此文件通常使用path_helper来设置PATH。该实用程序反过来会从/etc下的其他系统配置文件中读取信息(参见path_helper手册页)。

请注意,即使您禁用了通过bash读取初始化文件(例如使用命令行选项--noprofile),它仍将继承父进程的环境。


我只得到正则表达式。我正在寻找像/usr/local/mysql/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin这样的东西。但我没有那个.profile,也不在我的.bashrc中,但我知道它存在,因为我可以从$PATH中echo出来。 - Andy

18

如果您从 /etc/profile 开始,它应该长这个样子:

if [ -x /usr/libexec/path_helper ]; then
    eval `/usr/libexec/path_helper -s`
fi

这是测试文件是否存在,如果存在则执行它。如果你手动执行它,你会得到类似于这样的输出:

PATH="/usr/bin:/bin:/usr/sbin:/usr/local/bin:/usr/X11/bin"; export PATH;

我相信那就是你正在寻找的。它来自于 /etc/profile,而 /etc/profile 又会调用一个可执行文件来设置路径。


1
我理解了,我看了一下Adam指出的问题,但为了实现这一点,需要从某个地方获取信息。 path_helper内部的表达式是否确实生成/usr/local/mysql/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin ? - Andy
4
确实是从那里来的(通过 /etc/profile/etc/csh.login,具体取决于你使用的是 sh/bash 还是 csh/tcsh)。不过,要得到完整答案,请查看脚本内部的代码:它会查看 /etc/paths/etc/paths.d/*(这些文件应该都是文件,每个路径条目占一行)。 - torek
1
我不明白你所说的“表达式”的意思。path_helper是一个二进制可执行文件。它作为shell命令的一部分被使用反引号(第2行),输出生成的路径助手。该行的eval部分指示应将path_helper的输出作为shell的一部分执行。请注意,其最后一部分是export PATH;,这将结果放入您的环境shell中。 - Mike Taber
我对这个问题进行了更新并仔细查看了一遍。当时我不知道 @MikeTaber,但现在我是他的超级粉丝。惊叹于这个世界是多么的小啊。希望你一切都好。这是一个完全超出范围的评论哈哈。 - Andy
谢谢Andy!是的,这个世界真的很小。我在做Unix shell脚本编程和处理需要那种技能的产品时回答了这个问题。希望对你有所帮助。 - Mike Taber

7
如已接受的答案所提到的,$PATH 的构建是通过首先查看文件/etc/paths的内容,然后查看文件夹/etc/paths.d中的每个文件。因此,在预安装的系统安装中,$PATH包含这些文件中的每个条目,以及其他shell类型中的条目。

但是,由于在最新的Mac OS版本中,默认的shell是zsh,所以我按照几个教程进行操作,在这些教程中作者避免更改bash shell的$PATH,只需按以下方式编辑~/.zshrc即可添加新条目到$PATH

export PATH=/path/available/only/for/zsh/shells:$PATH

上述命令将 /path/available/only/for/zsh/shells 添加到 $PATH 中,并且添加的路径只能在 zsh shells 中使用。
我希望这对像我一样在 zsh shells 中的 $PATH 中有太多条目,而找不出其来源的人有所帮助!

1
在Mac上,.profile文件位于您的用户文件夹中:~/Users/youruser/ 但是,.profile文件是隐藏的。您可以在Finder上按Command+shift+.(command、shift、点)来查看它们。

1
我正在使用Catalina系统,但在该位置找不到.profile文件。也没有.bash_profile或.bashrc文件。 - Nic Foster
@NicFoster:请记住,在Catalina中,苹果决定将zsh作为默认shell - 取代了bash。您可能(或可能不会)拥有文件~/.zprofile~/.zshrc,它们具有相同的目的。 - user5395338
我不确定,但看起来Catalina不会直接给你访问$PATH的权限。相反,查看/etc/paths。对于我来说,第一行是/usr/local/bin;第二行是/usr/bin,以此类推。这是我的理解:每行上都有一个路径,而$PATH是这些行连接在一起的结果。如果想让你的路径排在最前面,将其放在第一行。如果想让它排在最后面,则将其放在最后一行。 - Gregg Williams
这并没有真正回答问题。默认路径的位置在beOn的被接受的答案中给出。 - Jan Hettich

0

在调试问题时,我今天才意识到一个重要的事实:配置文件(例如.bash_profile等)只被登录 shell读取。它们不会被用于启动应用程序的进程读取。

您以各种方式启动应用程序:单击/Applications中的图标,或在 Spotlight 搜索中键入名称,或单击 Dock 中的图标... 在所有这些情况下,应用程序本身(即应用程序内部的二进制文件或 shell 脚本)由launchd启动,没有任何父 shell。这意味着您的配置文件不会运行,并且将忽略您的自定义设置(PATH、环境变量等)。

这可能会导致各种问题,例如,如果您设置环境来使用特定版本的 Java,则您的应用程序将无法看到它并使用“默认”Java,这将是具有最高版本号的 Java。

在我的情况下,问题是当通过应用程序启动器运行应用程序时,我的应用程序崩溃了,但是从终端窗口运行时可以正常运行...原因是我有一个自定义路径,其中包括应用程序所需的一些库,但是在应用程序由启动器运行时不可用。

我使用的解决方案是将所需的库符号链接到/usr/local/lib目录下。

0
我在这里发布我的情况,以防其他人出现 slap-dash bash 技能。 我正在运行 MacOS Ventura,已经安装了 Anaconda,并在终端中初始化。 我想在某个编辑器中编辑 $PATH 变量,因为我想将一个目录放在首位,然后再删除它。根据谷歌搜索,处理 $PATH 变量的区域有多个,这让我感到非常困惑。 如果你和我一样的情况,或者只是使用 Anaconda,那么你可以在这里编辑路径。
由于我在 Mac 上,所以有 .zshrc 文件。打开该文件,你应该会看到一些处理 anaconda 的行,特别是你会看到 # >>> conda initialize >>>。 下面是 Anaconda 将自己的目录设置为 $Path 前缀。 你会注意到 else: 语句递归地附加了 /anaconda3/bin 路径 PATH="/somedirectorypath/anaconda3/bin:$PATH"。 如果你想暂时将某个路径放在前面,你可以在 anaconda 块之后添加 export PATH="newpath:$PATH"。然后你就可以去做自己的事情并将其删除。或者你可以通过 PATH = "newpath1:newpath2:newpath3" 来完全更改路径。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接