zsh通常已预装,只需确认安装、切换默认shell并手动配置oh-my-zsh;关键步骤包括用zsh --version和grep zsh /etc/shells验证、chsh -s "$(which zsh)"安全切换、手动克隆oh-my-zsh及插件、严格按序加载zsh-syntax-highlighting与zsh-autosuggestions。

别急着跑 install.sh —— 大部分 Linux 发行版已自带 zsh,真正要做的只是确认、切换、手动拉取 oh-my-zsh,再避开插件加载顺序和路径硬编码这两个坑。
确认 zsh 是否真没装,别被 “command not found” 欺骗
很多用户一看到 zsh: command not found 就立刻 sudo apt install zsh,结果发现装完 which zsh 输出是 /usr/bin/zsh,说明它本来就在系统里,只是没设为默认 shell。
- 先运行
zsh --version:有输出就代表已安装 - 再跑
grep zsh /etc/shells:必须有匹配行,否则chsh会静默失败 -
echo $SHELL显示的是登录时的 shell,不是当前终端正在跑的;临时进 zsh 用exec zsh,但改默认必须重开终端
chsh -s 必须用 $(which zsh),不能写死路径
硬写 /bin/zsh 或 /usr/bin/zsh 是常见翻车点。Arch 可能是 /usr/bin/zsh,Ubuntu 22.04+ 是 /usr/bin/zsh,而某些最小化安装镜像甚至放在 /usr/local/bin/zsh。
- 正确命令是:
chsh -s "$(which zsh)"(注意引号) - 输的是当前用户密码,不是 root 密码
- 执行后必须新开终端,再跑
echo $SHELL验证输出是否为 zsh 路径 - 万一输错导致无法图形登录:Ctrl+Alt+F2 进 TTY,运行
chsh -s /bin/bash $USER回退
手动克隆 oh-my-zsh,绕过 install.sh 的权限和路径陷阱
官方 install.sh 会自动改 ~/.zshrc、硬编码插件路径、覆盖已有 alias,还可能因网络中断留下残缺配置。更稳的做法是手动拉取:
- 先建标准目录:
mkdir -p ~/.oh-my-zsh/{custom,plugins,themes} - 用 Gitee 镜像克隆(国内更快):
git clone https://gitee.com/ohmyzsh/ohmyzsh.git ~/.oh-my-zsh - 复制模板:
cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc - 在
~/.zshrc顶部加一行:export ZSH="$HOME/.oh-my-zsh"(缺这行,后续插件全加载失败) -
ZSH_THEME先设成"robbyrussell",别一上来就填"powerlevel10k"——没下载主题文件会导致启动卡住
zsh-syntax-highlighting 和 zsh-autosuggestions 必须按序加载
这两个插件不是 oh-my-zsh 自带的,得手动克隆到 $ZSH_CUSTOM/plugins/,且加载顺序错了就全失效:高亮不工作、建议不弹出、甚至报 lib/misc.zsh:3: parse error near 'then'。
- 先克隆插件:
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git $ZSH_CUSTOM/plugins/zsh-syntax-highlighting - 再克隆另一个:
git clone https://github.com/zsh-users/zsh-autosuggestions $ZSH_CUSTOM/plugins/zsh-autosuggestions - 在
~/.zshrc的plugins=(...)行之后,**严格按顺序追加两行**:source $ZSH_CUSTOM/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zshsource $ZSH_CUSTOM/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh - 千万别把
zsh-autosuggestions放前面,它依赖zsh-syntax-highlighting提供的语法解析上下文
最常被忽略的其实是 export ZSH=... 这一行的位置和 source 插件的顺序 —— 它们不出错时一切正常,一出错就全挂,而且报错信息完全不指向真实原因。











