配置文件加载顺序
Zsh 的配置文件加载顺序遵循特定的逻辑,主要取决于 登录方式(Login/Non-login)和 交互模式(Interactive/Non-interactive)。
核心配置文件
| 文件 | 作用域 | 典型用途 |
|---|---|---|
~/.zshenv | 总是加载 | 环境变量、PATH(轻量、快速) |
/etc/zprofile | 登录 shell | 系统级登录配置 |
~/.zprofile | 登录 shell | 用户级登录配置(类似 .bash_profile) |
/etc/zshrc | 交互式 shell | 系统级交互配置 |
~/.zshrc | 交互式 shell | 主要配置文件(别名、函数、主题、插件) |
/etc/zlogin | 登录 shell(最后) | 系统级登录后执行 |
~/.zlogin | 登录 shell(最后) | 用户级登录后执行 |
~/.zlogout | 退出登录 shell | 清理工作 |
加载顺序图解
┌─────────────────────────────────────────────────────────┐
│ 启动 Zsh │
└─────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ 1. /etc/zshenv → 2. ~/.zshenv │
│ (系统级环境变量) (用户级环境变量,总是加载) │
└─────────────────────────────────────────────────────────┘
│
┌───────────────┼───────────────┐
▼ ▼ ▼
[登录 shell] [交互式 shell] [非交互式]
│ │ │
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ [脚本执行]
│3. /etc/zprofile│ │5. /etc/zshrc │
│4. ~/.zprofile │ │6. ~/.zshrc │ ← 最常用的配置
└─────────────┘ └─────────────┘
│ │
└───────┬───────┘
▼
┌─────────────────────┐
│ 7. /etc/zlogin │
│ 8. ~/.zlogin │
└─────────────────────┘
│
[退出时加载]
▼
┌─────────────────────┐
│ ~/.zlogout │
│ /etc/zlogout │
└─────────────────────┘实际使用建议
| 场景 | 推荐文件 | 原因 |
|---|---|---|
| PATH 等环境变量 | ~/.zshenv | 确保所有场景(包括脚本)都能访问 |
| 日常别名、主题、插件 | ~/.zshrc | 交互式 shell 专用,最常用 |
| SSH 登录后的初始化 | ~/.zprofile | 只在登录时执行一次(启动图形会话等) |
| 登录后的额外操作 | ~/.zlogin | 在 zshrc 之后执行,可用之前定义的功能 |
快速验证加载顺序
# 在每个文件顶部添加 echo 语句
echo "Loading: ~/.zshenv"
echo "Loading: ~/.zprofile"
echo "Loading: ~/.zshrc"
echo "Loading: ~/.zlogin"
# 然后新开终端观察输出顺序常见误区
- 不要把重型配置放
~/.zshenv—— 会影响所有子进程(包括脚本)的启动速度 - macOS Terminal 默认是登录 shell —— 会加载
zprofile,但 iTerm2 可能不同 - SSH 远程执行命令 —— 是非交互式,只加载
zshenv,不加载zshrc
需要我详细解释某个具体文件的使用场景吗?