◆
Mac 切换 bash 后 bash_profile 未生效解决
在 .bash_profile 里配好的环境变量和 alias,换终端或者新开窗口后失效,是 shell 启动文件加载规则导致的:.bash_profile 只在「登录 shell」启动时读一次,.bashrc 才是每次开非登录的交互式 shell 都读。macOS 的终端默认按登录 shell 启动,所以历史上大家习惯把配置全写进 .bash_profile;但一旦是在 IDE 内置终端、bash 子 shell、或者 zsh 环境里,走的就是另一条加载路径,那份配置自然没被执行。
zsh 更彻底一点——它压根不读 .bash_profile,只认 .zshrc / .zprofile。macOS Catalina 之后默认 shell 换成 zsh,很多人就是这时候发现原来的配置全没了。
稳妥的做法是不去搬迁配置,而是让每个 shell 的启动文件都去 source 那一份 .bash_profile,保持单一数据源。下面分别处理 bash 和 zsh。
bash 终端处理
bash 下补一条转发即可,让每次开交互式 shell 时都把 .bash_profile 执行一遍。
- 编辑
~/..bashrc
vi ~/..bashrc
- 添加内容
source 是在当前 shell 进程里执行那个文件,所以里面 export 的变量会留在当前会话中。这也是它和 bash xxx.sh 的区别——后者开子进程跑,跑完变量就没了。
source ~/.bash_profile
zsh 终端处理
zsh 同理,只是启动文件换成 .zshrc。这样一份 .bash_profile 就同时被 bash 和 zsh 共用了,改环境变量只需要动一个地方。
- 编辑
~/..zshrc
vi ~/..zshrc
- 添加内容
source ~/.bash_profile
注意事项
- 改完不会立刻生效,要么新开一个终端窗口,要么手动执行一次
source ~/.zshrc(bash 则 source.bashrc)。 .bash_profile里如果写了 bash 独有的语法(比如shopt、complete),zsh 里 source 会报 command not found。这类内容用条件判断包一层,只在$BASH_VERSION非空时执行。- 别在
.bash_profile里反过来 source.zshrc,会形成互相加载的死循环。 - PATH 用
export PATH="新路径:$PATH"这种追加写法,注意每次 source 都会再拼一遍,多次 source 后 PATH 里会出现重复项。虽然不影响功能,但排查问题时容易看晕。

还没有留言,来发表第一条吧~