默认 Shell 应通过 getent passwd $USER | cut -d: -f7 或 /etc/passwd 查看,而非 $SHELL;改用 chsh -s /bin/zsh 切换,重启终端生效;zsh 不兼容 bash 配置,需迁移至 ~/.zshrc。

怎么确认当前默认 Shell 是 bash
直接看 /etc/passwd 里你用户的那一行,最后一个字段就是默认 Shell。比如这行:alice:x:1001:1001::/home/alice:/bin/bash,说明当前默认是 /bin/bash。
别只信 $SHELL 环境变量——它可能被手动改过,不反映系统级默认值。
更可靠的方式是运行:getent passwd $USER | cut -d: -f7
用 chsh 切换默认 Shell 到 zsh
chsh 是唯一推荐的修改方式,它会校验 Shell 是否在 /etc/shells 里,避免把系统搞坏。
操作步骤:
- 先确认
zsh已安装且路径正确:which zsh(常见是/bin/zsh或/usr/bin/zsh) - 把它加进
/etc/shells(如果还没加):echo "/bin/zsh" | sudo tee -a /etc/shells - 执行
chsh -s /bin/zsh,输入密码确认
注意:chsh 必须在登录 Shell 中运行,不能在子 Shell 或脚本里静默调用——它会拒绝非交互式修改。
为什么改完没生效?新终端还是 bash
改的是「下次登录时的默认 Shell」,不是当前会话。当前终端不会自动切换,关掉重开才行。
常见误操作:
- 在当前 bash 里执行
exec zsh—— 这只是起个子进程,$SHELL还是/bin/bash,不影响登录行为 - 改了
/etc/passwd手动编辑 —— 容易格式错、权限错,chsh就是干这个活的,别绕开 - 用
sudo chsh -s /bin/zsh root改 root 的默认 Shell —— 某些发行版(如 Ubuntu)默认禁用 root 登录,改了也没实际意义
zsh 启动文件和 bash 不兼容
切换后第一次进 zsh,你会发现历史命令、别名、PS1 全丢了——因为 zsh 不读 ~/.bashrc,它认 ~/.zshrc。
快速补救:
- 复制一份基础配置:
cp /etc/skel/.zshrc ~/(如果存在) - 或者让 zsh 加载 bash 配置(不推荐长期用):
echo "source ~/.bashrc" >> ~/.zshrc - 注意:zsh 的
~/.zshenv、~/.zprofile、~/.zshrc加载时机和 bash 的~/.bashrc/~/.bash_profile不同,混用容易触发重复加载或环境变量丢失
真正要长期用 zsh,得把 alias、PATH、函数这些逐步迁移到 ~/.zshrc,而不是靠 source 应付。










