解析 macOS 下 Shell 配置文件

首先明确一点:/etc/profile /etc/bashrc ~/.bash_profile ~/.profile ~/.bashrc 这些文件是和某中 Shell 相关的(比如 bash、sh),当然也存在不使用这些文件的 Shell(比如 zsh)。

macOS 下,这些文件不会在系统登录的时候被执行,只会在 Terminal.app 等终端程序启动相应 Shell 时被加载执行。

bash

当 bash 作为一个 interactive login shell 或者以 bash --login 启动时:

  • 首先会尝试执行 /etc/profile 文件。
  • macOS 中的 /etc/profile 会调用 /etc/bashrc
  • 接下来依次寻找 ~/.bash_profile ~/.bash_login ~/.profile,执行第一个找到的文件。
  • 当 login shell 退出时,尝试执行 ~/.bash_logout

当 bash 不作为 login shell 启动时:

  • 尝试执行 ~/.bashrc
macOS 中的 ~/.bash_profile 会调用 ~/.profile 和 ~/.bashrc

sh

sh 会使用 /etc/profile 和 ~/.profile 文件

总结

macOS 下使用 bash 时,通常只需通过 ~/.bashrc 来配置环境变量即可。

如何全局设置 $PATH

我们需要看一下 $PATH 的构建过程:

  • 加入 /etc/paths 中的每一行
  • 加入目录 /etc/paths.d/ 下每个文件的每一行
  • shell 启动,执行 /etc/profile 等文件中的 export PATH=xxx:$PATH 语句

所以只需要在 /etc/paths.d/ 目录下新建一个文件,并在其中添加指定的路径,即可将其添加到全局范围内的 $PATH 变量中。

经过测试,macOS 下通过 /etc/paths 或 /etc/paths.d/ 设置 $PATH 变量后,新开 shell 会立即生效,无需重启。