macos catalina起默认shell为zsh,环境变量加载顺序为:/etc/zshenv→~/.zshenv→/etc/zprofile→~/.zprofile→/etc/zshrc→~/.zshrc;开发推荐统一配置到~/.zshrc,每次新开终端即生效。
mac 环境变量的加载顺序取决于你用的是哪种 shell,而自 macos catalina(10.15)起,默认 shell 已全部切换为 zsh。如果你没手动改过,那你的终端就是 zsh —— 所以重点看 zsh 的加载逻辑,bash 相关配置(如 .bash_profile)基本不生效,可直接忽略或删除。
zsh 的完整加载顺序(从早到晚,后加载的会覆盖前面)
zsh 启动时按固定顺序读取配置文件,分为系统级和用户级两类:
- /etc/zshenv:系统级,所有 zsh 实例必加载(包括脚本中调用的非交互式 shell),优先级最高
-
~/.zshenv:用户级,每次启动 zsh 都加载(哪怕只是跑一条
zsh -c "echo $PATH") - /etc/zprofile:系统级登录 shell 加载
- ~/.zprofile:用户级,仅在登录终端(如重启后首次打开 Terminal、SSH 登录)时加载
- /etc/zshrc:系统级交互式 shell 加载
- ~/.zshrc:用户级,每打开一个新终端窗口/标签页都会加载,开发最常用、最推荐写环境变量的地方
- /etc/zlogin 和 ~/.zlogin:极少使用,基本可忽略
PATH 特别说明:/etc/paths 和 /etc/paths.d/ 是独立机制
macOS 有个特殊设计:/etc/paths 和 /etc/paths.d/ 下的文件不是通过 shell 配置文件加载的,而是由系统工具 path_helper 在 shell 启动早期自动注入 PATH 的 —— 它会在 /etc/zshenv 之前或同时生效,且路径默认加在 PATH 最前面。
-
/etc/paths:一行一个路径,系统级全局生效 -
/etc/paths.d/:目录下每个文件可放多个路径,升级更安全(不会被系统更新覆盖) - 注意:这些路径是“硬塞进 PATH”的,不受 export 语句控制,容易导致版本混乱(比如 Go 新旧版本冲突)
为什么你改了 ~/.zshrc 还不生效?常见原因
- 终端没重启:改完
~/.zshrc后要新开终端,或运行source ~/.zshrc - 工具自动写入 ~/.zshenv:NVM、PNPM、SDKMAN 等常偷偷往这里加 PATH,它比 .zshrc 先加载,会把你的设置“盖住”
- 用了
su或sudo -s切换用户但没带-:环境变量没重载,建议用sudo -i或su - - 图形应用(如 VS Code、IntelliJ)不读终端配置:需通过
open -a "App" --args启动,或配置 launchd 环境
开发建议:只用这一个文件就够了
日常开发请统一把 export PATH=...、export JAVA_HOME=...、别名、插件等全写进 ~/.zshrc:
- 它稳定可靠,每次开终端都执行
- 避免分散在 .zprofile 或 .zshenv 中造成维护困难
- 如果必须全局生效(如让 GUI 应用也识别),再配合
/etc/paths.d/mydev添加关键路径











