我用的是苹果电脑。如果我打开终端并运行,echo $PATH
我会在环境中获得当前的“PATH”变量。如果我将某些内容添加到我的路径或其他环境变量中,它只会在该进程处于活动状态时持续存在。
我想知道的是,这个路径是如何获得默认值的?我查看了 .zshrc(如果我使用的是 bash,则查看 .bash*),但没有任何内容可以导出路径上的所有程序。控制此默认列表的操作系统有何作用PATH
?
答案1
login(1)
传统PATH
上在将事情交给 shell 之前进行设置,尽管您可能需要在 OS X 上进行不同的思考,因为还有~/.MacOSX/environment.plist
可以在哪里设置(可能不建议使用,除非某些特殊应用程序需要),最后我检查Apple正在添加一个命令来path_helper(8)
混淆.PATH
rc
/etc
对于 Mac OS XI 上的 ZSH,仅在以下位置手动禁用path_helper
和设置PATH
我的~/.zshenv
文件。如果您确实需要在 所设置的路径下进行某些操作,这可能并不理想path_helper
。
答案2
@corleone 发布的链接显示了如何解释 $PATH 环境变量。
当您在终端中声明它时它不会持续存在的原因是因为这是一个最终会退出的临时进程。该变量必须从启动 shell 时获取的文件中设置,该文件通常是点文件之一。
与许多操作系统不同,OS X 不会自动在用户的主目录中包含 .profile 或 .bashrc,而是默认为 .bash_profile,如果您确实创建了 .profile 或 .bashrc(这也将是评价)。
如果您想更新 $PATH 以包含特定目录,则放置它的最佳位置(在 OS X 上)将是您的 .bash_profile 中,该位置将优先于设置该特定变量的任何其他位置。如果您不想覆盖任何内容,而只是想添加一些内容,则可以在 .bash_profile 中添加如下行:
PATH="$PATH:/path/to/another/bin"
答案3
在 shell 启动时,/etc/profile
运行/usr/libexec/path_helper
,并且该命令的输出被eval
编辑以设置路径的初始值。查看man path_helper
该程序如何获取要放入其输出的初始目录列表。
答案4
负责loginwindow.app
为用户设置初始环境。传递loginwindow.app
身份验证过程,当用户通过身份验证时,环境将被设置,就像login -pf USERNAME
被调用一样(读取man login
和man environ
)。此时的PATH就和内核中设置的/usr/bin:/bin:/usr/sbin:/sbin
一样了。user.cs_path = /usr/bin:/bin:/usr/sbin:/sbin
我应该提到的是,这都是由 root 运行的,如果您使用的是 GUI 会话,则没有 shell。
默认情况下,Terminal.app 会将您的 shell 作为登录 shell 启动。login -pf USERNAME
运行(以 root 身份),然后读取 shell 的 rc 文件。对于bash
和ksh
,/private/etc/profile is read. For
zsh ,
/private/etc/zshenv is read. For
csh ,
/private/etc/csh.login is read. All use
/usr/libexec/path_helper to modify the PATH set by the
loginwindow.app`。