这一篇的目标很简单:搞懂 .zshrc、.bash_profile、.zprofile 这些文件的区别,再也不用纠结"配置写在哪里"。看完以后,你能明确知道配置该写在哪个文件里。
背景
在 macOS 里配终端环境,常见困惑基本是这几类:
.zshrc和.bash_profile到底有什么差别?- 为什么某个函数在新窗口里能用,开子 Shell 又不能用?
- 换成 Zsh 以后,之前 Bash 的配置为什么全“失灵”?
一、先确认你当前用的 Shell
macOS从Catalina(10.15)开始,默认Shell从Bash换成了Zsh
echo $SHELL
- 输出
/bin/zsh:当前是Zsh - 输出
/bin/bash:当前是Bash
这一步不能跳。因为 Bash 和 Zsh 的配置文件是两套体系。
二、Zsh 的配置文件
如果你现在是 Zsh,常见文件和加载时机如下:
| 文件 | 何时加载 | 典型用途 |
|---|---|---|
~/.zshenv | 每次启动 Zsh 都加载,最先执行 | 少用,只放必须全局生效的环境变量 |
~/.zprofile | 登录 Shell 时加载 | 常见于 Homebrew 或系统级初始化 |
~/.zshrc | 交互式 Shell 加载 | 日常主战场:别名、函数、插件、主题、PATH |
~/.zlogin | 登录 Shell,且在 .zshrc 后 | 很少用 |
~/.zlogout | 退出 Shell 时执行 | 很少用 |
“登录 Shell”怎么理解?
在 macOS 里,Terminal.app 或 iTerm2 新开一个窗口,通常就是登录Shell。
你在这个窗口里手动再输入一次zsh,进入的是子 Shell,行为会不一样。
简单记:
- 新开终端窗口:会走
.zprofile,也会走.zshrc - 在终端里再手动起一个
zsh:一般只走.zshrc
三、Bash 的配置文件
如果你还在用 Bash,常见文件如下:
| 文件 | 何时加载 | 典型用途 |
|---|---|---|
~/.bash_profile | 登录 Shell 时加载 | PATH、环境变量、函数 |
~/.bashrc | 非登录交互式 Shell 时加载 | 别名、函数、提示符 |
~/.profile | 登录 Shell 时加载(当 .bash_profile 不存在) | 通用配置 |
很多人会在.bash_profile里主动加:
source ~/.bashrc
这样可以保证登录场景下也能加载.bashrc里的内容。
四、实际建议:优先维护 ~/.zshrc
Zsh 读取:~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin ~/.zlogout
Bash 读取:~/.bash_profile ~/.bashrc ~/.profile
两者互不继承。
所以你从 Bash 切到 Zsh 后,~/.bash_profile里的函数和环境变量默认不会生效。
对大多数 macOS 用户,最稳的做法是把个人自定义都放在~/.zshrc里,比如:
- 自定义函数(如代理开关
proxy_on/proxy_off) - 环境变量(如
export PATH=...) - 命令别名(如
alias ll='ls -la') - 工具初始化(如 nvm、pyenv、rbenv)
- Oh My Zsh 的主题和插件配置
~/.zprofile 一般留给系统工具自动写入(比如 Homebrew),你自己的东西别放那里。其他几个文件(.zshenv、.zlogin、.zlogout)日常基本用不到。
从 Bash 迁到 Zsh 的实操步骤
**# 先看旧配置**
cat ~/.bash_profile
cat ~/.bashrc
# 把有用内容迁到 ~/.zshrc
# 把函数、别名、PATH、工具初始化脚本追加到文件末尾。
nano ~/.zshrc
#立即生效
source ~/.zshrc
临时省事方案
如果你现在不想逐段迁,可以先在.zshrc里加一行:
source ~/.bash_profile
这能让你先用起来。后面有空再慢慢拆分成 Zsh 友好的写法。
五、迁移示例
下面是一段常见的 Bash 配置,迁移时可以直接搬:
# 自定义代理函数
function proxy_on() {
export http_proxy=http://127.0.0.1:7890
export https_proxy=$http_proxy
echo "终端代理已开启。"
}
function proxy_off() {
unset http_proxy https_proxy
echo "终端代理已关闭。"
}
# PATH
export PATH="/usr/local/opt/curl/bin:$PATH"
# JetBrains 初始化
___MY_VMOPTIONS_SHELL_FILE="${HOME}/.jetbrains.vmoptions.sh"
if [ -f "${___MY_VMOPTIONS_SHELL_FILE}" ]; then
. "${___MY_VMOPTIONS_SHELL_FILE}"
fi
# 可选补全脚本
test -e "/Users/rick/.completion/ae.completion.sh" && source "/Users/rick/.completion/ae.completion.sh"
另外,nvm 经常是漏迁项,建议在.zshrc里补上:
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
最后
有些工具会往配置文件里追加变量。建议大家定期排查“被悄悄写入”的配置:
grep -n "关键词" ~/.zshrc ~/.bash_profile ~/.bashrc ~/.zprofile ~/.zshenv 2>/dev/null
例如检查API_KEY、BASE_URL这类字段,确认没有遗留配置。