我对如何设置 $PATH 有基本的了解,但是有没有文档可以完整描述 Mac OS 获取全部附加到 $PATH 的路径?我知道诸如 、 和 之类的东西/etc/profile
,/etc/paths
但是/etc/profile.d
还有其他脚本最终会影响 $PATH 的值吗?我也不太熟悉非登录 shell 和登录 shell(.bashrc
、.bash_profile
),但我知道它们的基本区别。
答案1
通常,你的 PATH 由 shell 设置。对于 Bash,一切都是手册中有说明。您也可以打开man bash
并跳至该INVOCATION
部分。
作为交互式登录 shell 调用,或者使用 --login
当 Bash 作为交互式登录 shell 或使用 --login 选项作为非交互式 shell 调用时,它首先从文件 /etc/profile 中读取并执行命令(如果该文件存在)。读取该文件后,它会按顺序查找 ~/.bash_profile、~/.bash_login 和 ~/.profile,然后从第一个存在且可读的文件中读取并执行命令。
作为交互式非登录 shell 调用
当启动非登录 shell 的交互式 shell 时,Bash 会从 ~/.bashrc(如果该文件存在)读取并执行命令。在 OS X 中,此外还有
path_helper
它读取内容/etc/paths.d
并将其附加到您的路径。
这里的关键是,在 OS X 上,终端默认打开登录 shell,而在 Linux 上,shell 通常以非登录 shell 的形式启动。Josh Staiger 有关于登录和非登录 shell 的详细解释。
因此,基本上只有这两个三个可以设置路径:
/etc/profile
(调用path_helper
)/etc/paths
和/etc/paths.d
(调用自path_helper
)- 你的 shell 配置文件 (
.bash_profile
)
答案2
/etc/paths
和中的路径/etc/paths.d/*
通常PATH
由路径助手.path_helper
从 运行/etc/profile
,因此当 bash 作为交互式登录 shell 调用时它会运行,但是当 bash 作为非登录 shell 或非交互式 shell 调用时它不会运行。
/etc/paths
默认包含/usr/local/bin
在末尾,并且/etc/paths.d/
默认为空。
终端和 iTerm 2 默认打开新 shell 作为登录 shell,当您通过 ssh 连接到计算机时打开的 shell 也是登录 shell。tmux
不过,其他平台上的许多终端仿真器、以及 Emacs 中的 shell 模式会将新 shell 作为非登录 shell 打开。
我已将此行添加到/etc/launchd.conf
:
setenv PATH ~/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/libexec:/usr/texbin
它更改根启动进程的值PATH
。该值由所有其他进程继承,包括每个用户启动进程。您可以/etc/launchd.conf
通过重新启动或运行launchctl < /etc/launchd.conf; sudo launchctl < /etc/launchd.conf
并重新启动进程来应用更改。
在 OS X 上,~/.profile
图形登录时不会读取。如果和都~/.bash_profile
存在~/.profile
,bash 也不会读取~/.profile
。
~/.MacOSX/environment.plist
在 10.8 中停止工作。