zsh 部署与 Bash 配置迁移指南

本文适合从 bash 切换到 zsh 的用户。你会学到:zsh 与 bash 配置文件的对应关系、安装与切换默认 shell、把 ~/.bashrc 中的别名/环境变量/函数安全迁移到 ~/.zshrc,以及哪些 Bash 专用语法不能直接照搬。

如果你已经习惯了 bash,但想切换到 zsh,最稳妥的方式不是"直接覆盖旧配置",而是先安装 zsh,再把 bash 中真正有用的配置逐步迁移过去。

这篇文档适合下面几种场景:

  • 新机器部署 zsh
  • 服务器或桌面环境从 bash 切换到 zsh
  • ~/.bashrc~/.bash_profile 中的别名、环境变量、函数迁移到 zsh

一、先了解 Bash 和 zsh 的配置文件差异

bash 常见配置文件:

  • ~/.bashrc:交互式 shell 常用配置,通常放别名、环境变量、函数
  • ~/.bash_profile:登录 shell 配置,常用于加载 ~/.bashrc
  • ~/.profile:更通用的登录环境配置

zsh 常见配置文件:

  • ~/.zshrc:最常用,交互式 shell 配置基本都放这里
  • ~/.zprofile:登录 shell 配置,类似 ~/.bash_profile
  • ~/.zshenv:所有 zsh 启动都会加载,不建议放复杂逻辑
  • ~/.zlogin:登录后执行,较少使用

可以简单理解为:

  • ~/.bashrc 大部分内容迁移到 ~/.zshrc
  • ~/.bash_profile 里的登录环境配置迁移到 ~/.zprofile

二、安装 zsh

Debian / Ubuntu

sudo apt update
sudo apt install -y zsh git curl

CentOS / Rocky / AlmaLinux

sudo dnf install -y zsh git curl

如果是较老系统:

sudo yum install -y zsh git curl

Arch Linux

sudo pacman -S --noconfirm zsh git curl

macOS

macOS 一般自带 zsh,可以先确认版本:

zsh --version
which zsh

三、确认 zsh 路径并切换默认 shell

先查看系统允许使用的 shell:

cat /etc/shells
which zsh

如果 which zsh 输出的路径已经在 /etc/shells 中,就可以切换:

chsh -s "$(which zsh)"

有些发行版需要重新登录后才会生效。可以退出当前会话再登录,或者直接执行:

exec zsh

检查当前 shell:

echo $SHELL
echo $0

四、先备份原有 Bash 配置

切换前建议先备份,避免误操作:

cp ~/.bashrc ~/.bashrc.bak 2>/dev/null
cp ~/.bash_profile ~/.bash_profile.bak 2>/dev/null
cp ~/.profile ~/.profile.bak 2>/dev/null

如果你之前已经有 zsh 配置,也顺手备份:

cp ~/.zshrc ~/.zshrc.bak 2>/dev/null
cp ~/.zprofile ~/.zprofile.bak 2>/dev/null

五、把 Bash 配置迁移到 zsh

1. 先筛选哪些内容可以直接迁移

~/.bashrc 中通常有以下几类内容:

  • alias 别名
  • export 环境变量
  • PATH 路径追加
  • shell 函数
  • 提示符 PS1
  • bash-completion
  • 只适用于 Bash 的语法或插件

其中最容易迁移的是:

  • alias
  • export
  • PATH
  • 大部分函数

需要额外处理的是:

  • shoptcompletebind 等 Bash 专用语法
  • [[ ... ]] 大多兼容,但复杂脚本建议单独测试
  • PROMPT_COMMAND 通常要改写
  • bash-completion 不能直接原样照搬

2. 推荐的迁移方式

不要直接把整个 ~/.bashrc 原封不动复制到 ~/.zshrc

推荐做法:

  1. 先创建一个干净的 ~/.zshrc
  2. 手动迁移常用别名、环境变量、函数
  3. 单独处理自动补全和提示符
  4. 打开一个新终端测试是否报错

3. 一个常见的迁移示例

假设原来的 ~/.bashrc 内容大致如下:

export EDITOR=vim
export PATH="$HOME/bin:$HOME/.local/bin:$PATH"

alias ll='ls -alF'
alias la='ls -A'
alias gs='git status'

if [ -f /etc/bash_completion ]; then
  . /etc/bash_completion
fi

parse_git_branch() {
  git branch 2>/dev/null | sed -n '/\* /s///p'
}

PS1='\u@\h:\w $(parse_git_branch)\$ '

迁移到 ~/.zshrc 后,可以写成:

export EDITOR=vim
export PATH="$HOME/bin:$HOME/.local/bin:$PATH"

alias ll='ls -alF'
alias la='ls -A'
alias gs='git status'

autoload -Uz compinit
compinit

parse_git_branch() {
  git branch 2>/dev/null | sed -n '/\* /s///p'
}

setopt PROMPT_SUBST
PROMPT='%n@%m:%~ $(parse_git_branch)%# '

这里最关键的变化有两点:

  • bash-completion 改成 autoload -Uz compinit && compinit
  • PS1 改成 zsh 常用的 PROMPT

六、建议直接使用的基础版 .zshrc

如果你想快速落地,可以先写一个基础版:

# 基础环境变量
export EDITOR=vim
export LANG=zh_CN.UTF-8
export PATH="$HOME/bin:$HOME/.local/bin:$PATH"

# 常用别名
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
alias gs='git status'
alias gp='git pull'
alias ..='cd ..'
alias ...='cd ../..'

# 启用补全
autoload -Uz compinit
compinit

# 历史记录
HISTSIZE=5000
SAVEHIST=5000
HISTFILE=~/.zsh_history
setopt HIST_IGNORE_DUPS
setopt SHARE_HISTORY

# 常用选项
setopt AUTO_CD
setopt CORRECT

# 提示符
PROMPT='%F{green}%n@%m%f:%F{blue}%~%f %# '

写入后重新加载:

source ~/.zshrc

七、登录环境如何迁移

如果你原来把登录环境写在 ~/.bash_profile 中,例如:

export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export GOPATH=$HOME/go
export PATH="$JAVA_HOME/bin:$GOPATH/bin:$PATH"

那么更推荐迁移到 ~/.zprofile

export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export GOPATH=$HOME/go
export PATH="$JAVA_HOME/bin:$GOPATH/bin:$PATH"

重新加载:

source ~/.zprofile

如果你不想区分那么细,也可以先统一放进 ~/.zshrc,后续再整理。

八、Bash 配置里哪些内容不要直接搬

下面这些内容迁移时要特别留意:

1. bash-completion

原来的 Bash 写法:

if [ -f /etc/bash_completion ]; then
  . /etc/bash_completion
fi

zsh 一般改成:

autoload -Uz compinit
compinit

2. shopt

例如:

shopt -s histappend
shopt -s checkwinsize

这类是 Bash 专用,不能直接照搬。要改用 setopt 对应实现。

3. PROMPT_COMMAND

如果你的 bash 用了:

PROMPT_COMMAND='history -a'

在 zsh 中通常需要改成钩子函数或 setopt 实现,不建议直接复制。

4. complete

如果你手动写过 Bash 补全:

complete -W "start stop restart" mycmd

这也是 Bash 风格,zsh 需要用自己的 completion 机制重新定义。

九、如果你想顺手装 Oh My Zsh

zsh 本身就能用,不安装 Oh My Zsh 也完全没问题。

如果你想更快获得主题、插件和更友好的默认体验,可以安装:

sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

安装后主要修改 ~/.zshrc 里的这几项:

ZSH_THEME="robbyrussell"
plugins=(git sudo)

如果是服务器环境,建议先保持精简,避免装太多插件导致启动变慢。

十、迁移完成后的检查命令

检查 shell 是否切换成功

echo $SHELL
ps -p $$ -o comm=

检查配置是否报错

zsh -n ~/.zshrc
source ~/.zshrc

检查别名和环境变量

alias
echo $PATH
echo $EDITOR

十一、常见问题

1. chsh 后重新登录还是 Bash

可能原因:

  • 当前终端工具强制指定了 shell
  • 你登录的不是当前用户
  • zsh 路径不在 /etc/shells

可以先检查:

grep "$(which zsh)" /etc/shells
getent passwd "$USER"

2. source ~/.zshrc 报错

通常是因为直接复制了 Bash 专用语法。优先排查这些关键字:

shopt
complete
PROMPT_COMMAND
bind

3. 颜色、提示符、补全和 Bash 不一样

这是正常的,因为 zshbash 的默认行为就不同。优先保证:

  • 命令能执行
  • 环境变量正常
  • 别名正常
  • 补全可用

界面样式可以后面再慢慢调。

十二、一个稳妥的迁移顺序

推荐按这个顺序操作:

  1. 安装 zsh
  2. 备份 bash 配置
  3. 切换默认 shell
  4. 先写最小可用版 ~/.zshrc
  5. 逐项迁移 aliasPATHexport、函数
  6. 再处理主题、补全、提示符
  7. 最后清理旧的无用配置

十三、最小化迁移方案

如果你只想先跑起来,可以直接执行下面这套:

sudo apt update && sudo apt install -y zsh
cp ~/.bashrc ~/.bashrc.bak 2>/dev/null
cp ~/.bash_profile ~/.bash_profile.bak 2>/dev/null
chsh -s "$(which zsh)"

然后把下面内容写入 ~/.zshrc

export PATH="$HOME/bin:$HOME/.local/bin:$PATH"

alias ll='ls -alF'
alias la='ls -A'
alias gs='git status'

autoload -Uz compinit
compinit

HISTFILE=~/.zsh_history
HISTSIZE=5000
SAVEHIST=5000
setopt HIST_IGNORE_DUPS
setopt SHARE_HISTORY

PROMPT='%n@%m:%~ %# '

重新打开终端,基本就可以用了。

十四、总结

bash 迁移到 zsh 并不复杂,核心就三件事:

  • 装好 zsh
  • 切换默认 shell
  • ~/.bashrc 中真正有用的内容迁移到 ~/.zshrc

不要一次性把整个 bash 配置文件无脑复制过去。先让 aliasPATHexport、函数这些基础能力跑通,再补主题和插件,成功率会高很多。

参考