
如果你刚拿到 MacBook兴冲冲打开终端准备敲两行命令结果迎面就是一句zsh: command not found那这篇文章就是写给你看的。macOS 从 Catalina 开始默认 Shell 已经换成了 Zsh但系统自带的 Zsh 基本属于裸奔状态——没有补全、没有高亮、提示符也朴素得不行。而 Oh My Zsh 就是目前最流行的 Zsh 配置管理框架装上之后终端立刻从黑白记事本变成信息清晰、操作流畅的生产力工具。这篇教程会覆盖我在 MacBook 上从零安装 Oh My Zsh 的完整流程、主题与插件配置、以及那些几乎人人都会踩的坑适合刚从 Windows 转过来、想认真把终端用起来的新手也能帮老手快速补齐一些容易忽略的细节。1. 为什么 MacBook 用户值得花 10 分钟配置 Oh My Zsh1.1 从 bash 到 zshmacOS 的默认 Shell 演进很多人不知道macOS 在 Catalina10.15之前默认 Shell 一直是 bash。但 Apple 出于许可证等考虑一直没有升级系统自带的 bash 版本长期停留在 3.2。这个版本既老又不方便很多现代脚本特性都不支持。到了 CatalinaApple 索性把默认 Shell 换成了 Zsh因为 Zsh 跟 bash 的语法大部分兼容同时功能上更现代、扩展性更好。但注意默认是 Zsh不等于Zsh 已经配置好了。你打开系统自带终端看到的只是一个普通的$提示符没有 Git 分支信息输入命令按 Tab 补全也可能不如预期。真正让 Zsh 好用的恰恰是它强大的配置生态而 Oh My Zsh 就是把这个生态串起来的那个架子。1.2 Oh My Zsh 到底解决了什么问题直接说痛点。裸 Zsh 有四个问题配置太散。.zshrc、.zprofile、.zshenv每个文件管什么、写在哪新手根本分不清更不用说不同机器上配置还不一致。主题不统一。Zsh 本身支持修改提示符Prompt但如果你不借助框架光写一行PS1...就够研究了。Oh My Zsh 把主题做成了一键切换。插件没有体系。Zsh 有补全、自动建议、语法高亮等一大堆能力但安装方式五花八门。Oh My Zsh 提供了一个custom/plugins目录统一管理。社区知识沉淀。Oh My Zsh 用的人多遇到问题搜一下基本都有答案。对一个新手来说这比一个什么都好但没人用的方案重要得多。所以我的观点很直接在 MacBook 上谈配置 Zsh 环境今天基本等价于安装 Oh My Zsh。倒不是说它完美但它确实是性价比最高的方案。1.3 装上之后立刻感受到的变化装完 Oh My Zsh 后最直观的变化有这么几个提示符从单调的userMacBook ~ %变成带颜色的、能显示当前 Git 分支的样子。输入git按两下 Tab会把子命令列出来输入cd再按 Tab会补全目录。默认启用了几十个 shell 别名比如ll、la、~以后少敲很多字。配合 zsh-autosuggestions 插件你之前敲过的长命令会以灰色字浮现在光标后面直接按右方向键就能补全。这些体验叠加起来你会明显觉得终端顺手了很多。2. 动手前的环境检查与准备2.1 确认 MacBook 型号与 macOS 版本安装 Oh My Zsh 本身对 MacBook 型号没有特殊要求但确认一下系统版本和芯片类型仍然值得做。点击左上角苹果图标选择关于本机看一下 macOS 版本和芯片信息。芯片类型决定了后续一些软件安装路径Apple SiliconM1/M2/M3/M4 系列Homebrew 默认装到/opt/homebrew对应可执行文件在/opt/homebrew/bin。Intel 芯片Homebrew 默认装到/usr/local对应可执行文件在/usr/local/bin。如果你以后要用 Homebrew 装 zsh 或者其他工具这个路径差异会直接体现在命令是否找得到的问题上。现在先记住就行。2.2 确认当前 Shell 和 Zsh 版本打开终端执行zsh --version看到zsh 5.x这样的输出说明系统自带 Zsh 可用。接着执行echo $SHELL如果输出/bin/zsh说明当前已经是 Zsh。如果输出/bin/bash说明这台机器是从旧系统升级上来的或者被改过默认 Shell。不用急等 Oh My Zsh 装完之后我们再执行chsh -s /bin/zsh切换。还有一个细节很多教程会直接让你执行curl ... | sh但如果你对管道安装有抵触也可以先下载脚本看一眼再执行。这个看个人习惯不过我建议新手至少知道这条命令在干什么而不是机械复制。2.3 安装 Xcode Command Line ToolsOh My Zsh 本身不是编译型软件但你在配置插件、克隆仓库、运行部分安装脚本时系统需要 git、clang 等基础工具。 macOS 上这些东西都包含在 Xcode Command Line Tools 里。执行xcode-select --install系统会弹窗点击安装即可。这个过程可能持续几分钟。装完后验证一下git --version能输出版本号就说明环境没问题了。如果你已经装过 Xcode 或者 Command Line Tools这一步会自动跳过或提示已安装。2.4 检查 Homebrew装不装、什么时候装先说结论安装 Oh My Zsh 不依赖 Homebrew。你可以先装 Oh My Zsh之后再用 Homebrew 安装其他开发工具。但我的建议是既然你已经开始折腾终端了Homebrew 迟早要装它是 macOS 上最主流的包管理器。检查是否已安装brew -v如果提示command not found: brew需要安装。官方一行命令是/bin/bash -c $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)这条命令在海外网络环境下很顺畅但如果你在的地区访问 GitHub 不稳定可能卡在下载阶段。此时不用硬磕官方源可以改走国内镜像站比如中科大、清华的 Homebrew 镜像按镜像站给出的安装说明操作即可。我个人的建议是安装脚本这种东西优先看官方维护的渠道其次是高校镜像站不要随手执行来路不明的一键脚本否则以后出了问题都不知道是谁埋的雷。3. 安装 Oh My Zsh 主程序官方脚本与国内镜像的取舍3.1 官方安装命令与脚本行为拆解Oh My Zsh 官方给出的安装命令是sh -c $(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)很多人照着敲完就完事了但我不建议盲抄。拆开看这四个部分sh -c以 Shell 方式执行后面引号里的内容。curl下载工具。-f遇到 HTTP 错误就失败退出避免把错误页面当脚本执行。-s静默模式不显示下载进度。-S出错时仍然显示错误信息。-L跟随重定向因为 raw 链接经常跳转。脚本本身做的事情大致是克隆 ohmyzsh 仓库到用户目录~/.oh-my-zsh如果已经存在.zshrc会先备份成.zshrc.pre-oh-my-zsh然后从模板生成新的.zshrc并把默认 Shell 切换为 zsh。3.2 国内网络环境下的镜像安装方案如果你执行官方命令后卡在Cloning...半天没反应或者直接报Failed to connect to raw.githubusercontent.com port 443不用纠结网络问题本身换镜像源就好。方案一直接用 gitee 上社区维护的 oh-my-zsh 镜像仓库跑安装脚本sh -c $(curl -fsSL https://gitee.com/mirrors/oh-my-zsh/raw/master/tools/install.sh)方案二手动克隆镜像仓库再复制配置模板git clone https://gitee.com/mirrors/oh-my-zsh.git ~/.oh-my-zsh cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc第二种方式更透明你知道每一步在做什么。克隆完成后再手动执行chsh -s /bin/zsh切换默认 Shell然后新开终端Oh My Zsh 就会加载。如果你不想用 gitee也可以关注 ohmyzsh 官方仓库里文档提到的其他镜像信息。社区镜像可能滞后于官方仓库几个版本但对绝大多数用户没有影响。3.3 安装成功后生成的关键文件不管用哪种方式装完你的用户目录下都会多出两个核心东西~/.oh-my-zsh/是 Oh My Zsh 本体里面有themes/主题文件夹。plugins/内置插件文件夹。custom/自定义主题、插件、脚本的推荐位置。templates/配置模板。tools/升级、卸载脚本。~/.zshrc是 Zsh 的主配置文件。每次新开终端Zsh 都会加载它。以后你改主题、加插件都是编辑这个文件。另外安装脚本如果发现你之前有.zshrc会生成一个.zshrc.pre-oh-my-zsh备份。不要急着删掉里面可能还有你需要的环境变量。3.4 验证安装并确保默认 Shell 正确安装完成后执行echo $ZSH如果输出~/.oh-my-zsh说明 Oh My Zsh 已经被正确加载。再执行echo $ZSH_THEME默认应该输出robbyrussell这是 Oh My Zsh 的默认主题。然后确认默认 Shellchsh -s /bin/zsh这个命令会要求输入用户密码以后新开终端都会默认使用 Zsh。建议顺手把终端退出重开一次否则当前会话还停留在旧状态。4. 主题选择与 Powerlevel10k 实战从默认主题到高颜值终端4.1 内置主题的一键切换逻辑Oh My Zsh 自带几十个主题切换方式是编辑~/.zshrc找到ZSH_THEMErobbyrussell改成你喜欢的主题名比如agnoster、ys、sunrise保存后执行source ~/.zshrc刷新配置。就这么简单。主题名的来源是~/.oh-my-zsh/themes/目录下的文件名。但是内置主题里很多都需要特殊字体才能完美显示尤其是 agnoster 这种带箭头符号的。如果你不装字体往往会在路径那里看到一堆乱码方块。这也是我为什么建议直接上 Powerlevel10k它在美观和功能之间平衡得很好。4.2 安装 Powerlevel10k 主题Powerlevel10k 严格来说是 Oh My Zsh 的外部主题需要手动克隆到 custom 目录git clone --depth1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k如果 GitHub 下载速度不理想可以去找社区有没有对应的镜像仓库替换链接原理一样。克隆完成后修改~/.zshrcZSH_THEMEpowerlevel10k/powerlevel10k保存后执行source ~/.zshrc第一次加载会进入交互式配置向导按提示选择你喜欢的样式即可。如果你不想用向导也可以直接运行p10k configure重新配置。4.3 MesloLGS NF 字体乱码的根治方案Powerlevel10k 的很多图标、箭头、分支符号普通字体里没有。如果你在 macOS 自带终端或 iTerm2 里看到一排排方块那不是主题坏了是缺字体。正确的做法是安装 MesloLGS NF 字体。这套字体是 Nerd Font 体系下的专门覆盖终端图标需求。需要在 powerlevel10k 仓库的fonts/目录下找到 MesloLGS NF Regular、Italic、Bold、Bold Italic 四个文件下载后双击通过系统字体册应用安装。装好字体后还要在终端里手动指定iTerm2Preferences→Profiles→Text→Font选择MesloLGS NF。macOS 自带终端终端→设置→描述文件→文本→字体选MesloLGS NF。这一步非常关键不少人在主题上折腾半天最后发现只是字体没换。4.4 终端配色与主题风格的搭配Powerlevel10k 的提示符样式配置好之后终端本身的背景色、文字色也需要搭配。macOS 自带终端里可以新建描述文件调背景色为纯黑或深蓝iTerm2 则支持更丰富的 Color Presets类似 Snazzy、Dracula、Solarized 这类配色方案。我个人习惯用深色背景加高对比度文字因为长时间看终端白底黑字特别容易疲劳。你可以在终端的描述文件或Profiles里多存几套配色按场景切换——晚上用深色白天用浅色都行。配色是纯个人偏好不用追求跟别人一模一样。强制要求只有一个字体选对图标不乱。5. 让终端真正好用常用插件与配置优化5.1 搞懂插件机制内置与 custom 的区别Oh My Zsh 的插件分两类一类是内置在~/.oh-my-zsh/plugins/下的启用方式是在~/.zshrc里修改plugins(git extract z)每个插件本质上是一个.plugin.zsh文件里面是别名、函数、补全定义的集合。启用哪个写在括号里就行空格分隔。另一类是需要自己克隆到~/.oh-my-zsh/custom/plugins/下的第三方插件。为什么要分开因为 Oh My Zsh 自带的升级脚本会更新~/.oh-my-zsh目录如果你把第三方插件放在系统内置目录里升级时可能被覆盖或冲突。放在 custom 目录里升级不会碰它。5.2 三款值得装的第三方插件第一个是zsh-autosuggestions它的作用是记录你敲过的命令在下次输入时以灰色字体提示历史命令按右方向键直接补全。安装git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions第二个是zsh-syntax-highlighting输入合法命令时命令显示为绿色输入不存在的命令时会显示红色。对新手来说这个反馈非常直观。安装git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting第三个是zsh-completions它补充了大量命令的补全定义尤其是 pip、npm、docker 这些常用命令的 Tab 补全。安装git clone https://github.com/zsh-users/zsh-completions ${ZSH_CUSTOM:-${ZSH:-~/.oh-my-zsh}/custom}/plugins/zsh-completions然后修改~/.zshrc的 plugins 行plugins(git zsh-autosuggestions zsh-syntax-highlighting zsh-completions)保存后执行source ~/.zshrc。还有一个细节zsh-syntax-highlighting官方文档要求把这个插件放在 plugins 列表最后一个这样才能正确高亮其他插件定义的命令。建议严格按照这个顺序写。5.3 内置神器git、extract、z不需要安装额外的第三方插件Oh My Zsh 内置的这些就够你用很久。git插件提供了一堆常用别名gstgit statusgcogit checkoutgcagit commit -v -aglggit log --stat --onelineextract插件可以让你不用记各种解压参数比如.tar.gz、.zip、.rar统一用extract 文件名就能智能解压。这个在 MacBook 上尤其省心因为 macOS 自带的 tar 命令参数偏怪我每次都想不起来。z插件负责目录快速跳转。它根据你访问过的目录频率来定位你在任何位置输入z 项目名关键字就能 cd 到最常访问的那个匹配目录。举个例子z blog如果在/Users/你的名字/Projects/blog打开过多次它会直接跳过去不用一层层找路径。5.4 自己加别名和函数别以为 Oh My Zsh 自带的别名就够了最终还得按自己的习惯加。打开~/.zshrc在文件末尾追加alias llls -lah alias ipifconfig en0 | grep inet | awk {print \$2} alias reloadsource ~/.zshrcsource ~/.zshrc生效后ll、ip、reload就都可以用了。如果你的操作不是简单的一条命令那就写函数。比如我常用的创建目录并进入mkdircd() { mkdir -p $1 cd $1 }保存并 reload 之后输入mkdircd www目录创建完直接跳进去省两步操作。注意一点别在.zshrc里堆一大堆自己都记不住的别名。终端追求的是效率不是收藏夹。5.5 启动速度优化不要盲目堆插件Oh My Zsh 越配置越顺手的代价是启动速度可能变慢。尤其是装了一堆第三方插件后每次新开终端都要加载所有插件明显能感觉到卡顿。先量化一下现状在终端里执行time zsh -i -c exit看输出的 real 时间0.3 秒以内算正常超过 0.5 秒就有点拖沓了。如果确实慢从头查起plugins列表里只保留实际用到的插件。移除zsh-completions这类体积大的补全插件如果你本来就不太依赖补全的话。确认~/.zshrc里没有频繁调用外部命令比如不要每次都执行brew --prefix。Oh My Zsh 还内置了zprof性能分析模块。在~/.zshrc开头加入zmodload zsh/zprof文件末尾加zprof然后source ~/.zshrc终端会打印每个模块的加载耗时。看到哪一项占用高优先处理哪一项。分析完记得删掉这两行别一直开着。6. MacBook 上最常见的 zsh 报错与排查思路6.1 command not found拼写、环境变量与软件未装这类报错可能是 zsh 用户遇到最多的热搜里就有zsh: command not found: chomd这种经典案例。先说结论chomd拼错了正确命令是chmod用来修改文件权限。遇到command not found先按这个顺序排查拼写是否正确。很多命令我第一遍也会敲错这是最便宜的排查方式。软件是否真的装了。macOS 新版系统已经不再自带telnetopencode这类工具也需要你自己安装。不要默认系统应该有。PATH 环境变量是否包含可执行文件目录。执行echo $PATH看看是否包含/opt/homebrew/binApple Silicon或/usr/local/binIntel。如果某条命令装在 Homebrew 目录里但该目录不在 PATH 中就永远找不到。运行hash -r。有时候 zsh 会缓存旧命令路径新装的命令找不到时可以刷新一下。如果你需要临时把某个目录加进 PATH执行export PATH/某个目录:$PATH但这是临时的新开终端又没了。长期生效要写进~/.zprofile或~/.zshenv我一般在~/.zprofile里统一管理 PATH。6.2 chmod 与文件权限正确姿势和常见的 Operation not permittedchmod是 Linux/macOS 下修改文件权限的命令。安装脚本或者自制的.sh文件如果提示 permission denied就需要先给执行权限chmod x 你的脚本.sh ./你的脚本.sh如果你下载了一个来自网络的脚本macOS 的 Gatekeeper 可能给它打上隔离属性执行时也会被拦。此时可以查看扩展属性xattr -l 你的脚本.sh如果看到com.apple.quarantine可以手动移除再执行xattr -d com.apple.quarantine 你的脚本.sh另一个容易误操作的点是不要试图在系统保护目录下随意创建文件然后遇到Operation not permitted的时候去琢磨关闭系统完整性保护SIP。为了执行一个脚本关闭安全机制风险远大于收益。我的建议是把要执行的脚本放到自己的用户目录从源头避开这类问题。6.3 curl 443 失败与 macOS 时间不同步的连锁反应安装 Oh My Zsh 或 Homebrew 时curl 报错是最常见的。两种典型报错要区分一种是curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused这是网络无法连上目标主机常见原因是域名被干扰或者 DNS 解析异常。可以先试ping raw.githubusercontent.com看能不能通不通的话换用 gitee 镜像安装或者稍后重试。另一种比较隐蔽curl: (60) SSL certificate problem: certificate has expired这个很多人都想不到跟系统时间有关。如果你的 MacBook 时间被手动改过、电池耗尽后时间重置、或者长期睡眠后时间漂移SSL 证书校验就会失败因为证书的有效期完全依赖本机时间。修复方法sudo sntp -sS time.apple.com或者走图形界面系统设置→通用→日期与时间打开自动设置。时间校准后再跑安装命令一般就好了。6.4 系统数据占用过高与终端缓存清理很多 MacBook 用户会感觉到系统数据占了几十个 GB这其实跟终端环境也有关系。Homebrew 每次安装包、升级包都会留下历史版本npm 和 pip 也会产生缓存。几个快速释放空间的命令# Homebrew 清理旧版本和缓存 brew cleanup -s # npm 缓存清理 npm cache clean --force # pip 缓存清理 pip cache purge还有个容易被忽略的~/.zsh_history这个文件会随着年龄增长变得非常大。如果里面存了上万条历史命令不仅占空间还会拖慢终端启动。你可以打开看看行数wc -l ~/.zsh_history如果几十万行保留最近一部分即可。注意操作前先备份别删完才发现自己要找的命令在里面。6.5 zsh 配置加载顺序PATH 为什么时灵时不灵最后讲一个很多人长期困惑的问题为什么我在.zshrc里写了export PATH...有时候生效有时候不生效原因是 Zsh 有多个配置文件的加载顺序/etc/zshenv ~/.zshenv /etc/zprofile ~/.zprofile /etc/zshrc ~/.zshrc /etc/zlogin ~/.zlogin登录时会加载 zprofile、zshrc、zlogin非登录交互式 Shell 只加载 zshenv、zshrc。macOS 的终端默认打开的是登录 Shell所以日常用.zprofile放环境变量、.zshrc放别名和插件配置是合理的分工。如果你在.zshrc里反复做export PATH新目录:$PATH每次加载都往前面塞一段最后 PATH 会变得非常长。我自己遇到过类似问题排查半天最终发现是.zshrc里既有旧的 Homebrew 路径又在.zprofile里追加了一份。所以记住一句话工具路径、环境变量这类一次定义、全局只用的内容放.zprofile交互体验相关、依赖当前 Shell 会话的内容放.zshrc。说点个人的体会。Oh My Zsh 不是你装完就一劳永逸的东西它需要随着你的使用习惯慢慢调整。我每次拿到新 MacBook做的第一件事就是装 Xcode Command Line Tools、Homebrew、Oh My Zsh然后配 Powerlevel10k 加自动建议插件整个过程不到十分钟。但真正让终端好用的是我后来陆续加的十几个别名、几个自己写的函数、以及逐渐精简下来的插件列表。终端是拿来干活的不是拿来当摆设的。如果你在配置过程中遇到任何报错先看报错信息本身再去搜关键词最后动手改配置——大部分问题在你把日志贴进搜索框的那一刻答案就出来了。