求Bash与Zsh启动文件加载顺序及场景差异的完整概览
求Bash与Zsh启动文件加载顺序及场景差异的完整概览
我完全懂你这种纠结!当初我自己研究shell启动文件的加载顺序时,也碰到过网上资料互相矛盾、啃手册啃半天还是摸不清的情况。下面我整理了Bash和Zsh在不同场景下的启动文件加载逻辑,应该能帮你理清楚:
Bash 启动文件加载逻辑
1. 交互式登录Shell(比如通过SSH远程登录、终端开机直接进入的Shell)
- 首先加载系统级的
/etc/profile,然后按顺序查找用户级的文件,找到第一个存在且可读的就加载:~/.bash_profile~/.bash_login~/.profile
- 退出登录时,会加载
~/.bash_logout
2. 交互式非登录Shell(比如在图形界面里打开的终端、从已有Shell里再开的子Shell)
- 优先加载用户级的
~/.bashrc,部分发行版会在这个文件里调用系统级的/etc/bash.bashrc或者/etc/bashrc - 注意:很多人会在
.bash_profile里加一句[[ -f ~/.bashrc ]] && source ~/.bashrc,让交互式登录Shell也能加载.bashrc的配置
3. 非交互式Shell(比如执行Shell脚本、通过bash script.sh启动的Shell)
- 默认不加载任何启动文件,除非设置了环境变量
$BASH_ENV,此时会加载这个变量指向的文件
Zsh 启动文件加载逻辑
Zsh的逻辑比Bash更统一,不管交互与否,默认都会先加载某个基础文件:
1. 所有Shell(交互/非交互,除非加-f参数跳过)
- 首先加载系统级的
/etc/zshenv,然后加载用户级的~/.zshenv(如果$ZDOTDIR有设置,就用$ZDOTDIR/.zshenv)
2. 交互式登录Shell
在加载完.zshenv之后,按顺序加载:
- 系统级
/etc/zprofile→ 用户级~/.zprofile - 系统级
/etc/zshrc→ 用户级~/.zshrc - 系统级
/etc/zlogin→ 用户级~/.zlogin - 退出时加载系统级
/etc/zlogout→ 用户级~/.zlogout
3. 交互式非登录Shell
在加载完.zshenv之后,按顺序加载:
- 系统级
/etc/zshrc→ 用户级~/.zshrc
4. 非交互式Shell
在加载完.zshenv之后,如果设置了环境变量 $ZSH_ENV,会加载这个变量指向的文件
核心差异点总结
- Zsh不管交互与否都会默认加载
.zshenv,而Bash非交互式默认不加载任何文件 - Bash的交互式登录Shell优先找
.bash_profile,而Zsh的交互式登录会依次加载zprofile、zshrc、zlogin - 很多Bash用户会手动让
.bash_profile调用.bashrc,但Zsh不需要这个操作,因为交互式登录已经会加载zshrc
备注:内容来源于stack exchange,提问作者Silas
相关产品推荐
相关产品推荐

