配置文件加载顺序

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"
 
# 然后新开终端观察输出顺序

常见误区

  1. 不要把重型配置放 ~/.zshenv —— 会影响所有子进程(包括脚本)的启动速度
  2. macOS Terminal 默认是登录 shell —— 会加载 zprofile,但 iTerm2 可能不同
  3. SSH 远程执行命令 —— 是非交互式,只加载 zshenv,不加载 zshrc

需要我详细解释某个具体文件的使用场景吗?