Zsh 与 Bash 配置文件:用法、区别、迁移

这一篇的目标很简单:搞懂 .zshrc.bash_profile.zprofile 这些文件的区别,再也不用纠结"配置写在哪里"。看完以后,你能明确知道配置该写在哪个文件里。

背景

在 macOS 里配终端环境,常见困惑基本是这几类:

  • .zshrc.bash_profile 到底有什么差别?
  • 为什么某个函数在新窗口里能用,开子 Shell 又不能用?
  • 换成 Zsh 以后,之前 Bash 的配置为什么全"失灵"?

一、先确认你当前用的 Shell

macOSCatalina(10.15)开始,默认ShellBash换成了Zsh

bash 复制代码
echo $SHELL
  • 输出/bin/zsh:当前是 Zsh
  • 输出/bin/bash:当前是 Bash

这一步不能跳。因为 BashZsh 的配置文件是两套体系。

二、Zsh 的配置文件

如果你现在是 Zsh,常见文件和加载时机如下:

文件 何时加载 典型用途
~/.zshenv 每次启动 Zsh 都加载,最先执行 少用,只放必须全局生效的环境变量
~/.zprofile 登录 Shell 时加载 常见于 Homebrew 或系统级初始化
~/.zshrc 交互式 Shell 加载 日常主战场:别名、函数、插件、主题、PATH
~/.zlogin 登录 Shell,且在 .zshrc 很少用
~/.zlogout 退出 Shell 时执行 很少用

"登录 Shell"怎么理解?

在 macOS 里,Terminal.appiTerm2 新开一个窗口,通常就是登录Shell。

你在这个窗口里手动再输入一次zsh,进入的是子 Shell,行为会不一样。

简单记:

  • 新开终端窗口:会走 .zprofile,也会走 .zshrc
  • 在终端里再手动起一个zsh:一般只走 .zshrc

三、Bash 的配置文件

如果你还在用 Bash,常见文件如下:

文件 何时加载 典型用途
~/.bash_profile 登录 Shell 时加载 PATH、环境变量、函数
~/.bashrc 非登录交互式 Shell 时加载 别名、函数、提示符
~/.profile 登录 Shell 时加载(当 .bash_profile 不存在) 通用配置

很多人会在.bash_profile里主动加:

bash 复制代码
source ~/.bashrc

这样可以保证登录场景下也能加载.bashrc里的内容。

四、实际建议:优先维护 ~/.zshrc

bash 复制代码
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 的实操步骤

bash 复制代码
**# 先看旧配置**
cat ~/.bash_profile
cat ~/.bashrc

# 把有用内容迁到 ~/.zshrc
# 把函数、别名、PATH、工具初始化脚本追加到文件末尾。
nano ~/.zshrc

#立即生效
source ~/.zshrc

临时省事方案

如果你现在不想逐段迁,可以先在.zshrc里加一行:

bash 复制代码
source ~/.bash_profile

这能让你先用起来。后面有空再慢慢拆分成 Zsh 友好的写法。

五、迁移示例

下面是一段常见的 Bash 配置,迁移时可以直接搬:

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里补上:

bash 复制代码
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"

最后

有些工具会往配置文件里追加变量。建议大家定期排查"被悄悄写入"的配置:

bash 复制代码
grep -n "关键词" ~/.zshrc ~/.bash_profile ~/.bashrc ~/.zprofile ~/.zshenv 2>/dev/null

例如检查API_KEYBASE_URL这类字段,确认没有遗留配置。

相关推荐
代码对我眨眼睛10 小时前
Mac 如何单独修改鼠标滚动方向,而不影响触控板
macos·计算机外设·策略模式
qq_49244844611 小时前
MAC 怎么配置定时任务
macos
2601_9560028111 小时前
AdGuardPro_TS.ipa2026最新版ipa 下载后浏览器无广告 官方正版2026最新版pc免费下载(看到请立即转存 资源随时失效)ios必下
macos·ios·cocoa·ipa
技术人生黄勇11 小时前
Hermes Agent 桌面端:工作台 + Windows/Mac 双端 + 多智能体协作
macos
xiaoliuliu1234511 小时前
Petrel 2017油气勘探软件安装教程:MAC 地址修改+三维地质建模
macos
阿洛学长11 小时前
Python安装与环境安装全程详细教学(包含Windows版和Mac版)
windows·python·macos
jiushiaifenxiang12 小时前
Parallels Desktop for Mac 26.3.2 (57398)中文版新功能介绍
macos·策略模式
初雪云13 小时前
没有Mac电脑,如何完成iOS应用上架?三个方案的实战对比
macos·ios
TheBlackHoleLab13 小时前
macOS下的ESP32开发环境配置之离线安装ESP-IDF不走寻常路版
macos
Irene199114 小时前
Shell 相关基础入门,在 Ubuntu 与 CentOS Shell 中的语法差异总结(bash、dash、sh)
shell