说起来有点不好意思——作为一个每天和命令行打交道的人,我花在「配置终端」这件事上的时间,足够写好几篇正经技术文章了。但回头看这段折腾历程,倒也不算浪费,因为它让我真正搞懂了一件事:你的工具越简单,你越能把注意力放在真正重要的事情上。
一切从 bash 开始,然后我搞砸了#
我用的是 macOS,系统默认 bash。坦白说,用了挺长一段时间我都没觉得有什么问题——直到我开始用 Git,看到同事的终端上显示着漂亮的分支名和状态,我的好奇心彻底被点燃了。
那大概是 2019 年的事。我在某个下午打开了 oh-my-zsh 的官网,运行了那条安装命令,然后——哇,色彩缤纷了。Git 状态显示、分支名高亮、智能提示……我的终端突然变得像一个正经的 IDE 一样了。满足感持续了大概三天。

然后问题来了。
oh-my-zsh 的甜蜜陷阱#
oh-my-zsh 的 slogan 是「给你的终端装上翅膀」。它确实做到了——前提是你愿意在翅膀上绑足够多的铅块。
我的 .zshrc 文件在三个月内疯狂膨胀。插件从 5 个变成 20 个,后来变成将近 40 个。主题从默认的 robbyrussiel 换成了 powerlevel10k,每次启动终端要加载整整两秒——别笑,两秒在每天打开终端几百次的情况下,就是半小时的浪费。
更糟糕的是插件冲突。z 是用来快速跳转目录的,zsh-autosuggestions 是用来根据历史补全命令的,看起来都是无害的功能。但当它们同时启用时,方向键的上翻历史功能时不时抽风,有时候按一下 ↑ 跳出来的建议会把你已经打了一半的命令完全覆盖掉。查文档、调配置、禁用这个试试那个……循环往复。
我花了整整两个周末,去折腾一个「如何让上下键正常工作」的 bug。那两个周末我本可以写两篇文章,或者学一门新课。
更讽刺的是,有一天我的终端突然报了个 plugin 找不到的错误,进不去 oh-my-zsh 的加载环境,直接把我丢回了原始的 bash。重启之后我才发现,原来我连最基础的 zsh 配置都写不出来了——我已经太久没有亲手写过一行 zsh 配置了。
powerlevel10k:我以为我需要的东西,其实不需要#
2021 年我换到了 powerlevel10k 这个主题。它的功能确实强大:显示 Git 状态、精确到秒的执行时间、CPU 占用、AWS 环境变量……我把几乎所有能打开的选项都打开了。
结果是什么呢?启动变慢了不说,终端上密密麻麻的信息让我根本无法专注。我花了两秒钟在满屏的数据里找到我打的命令,然后发现我需要的信息其实只有一行:上一个命令是否成功执行。
更荒谬的是,我根本不碰 AWS,不需要显示 CPU 占用,Git 分支状态我自己一个 git status 就能看到。我用 powerlevel10k 配置了一个信息密度极高的界面,然后自己把它当成噪声忽略了。
这大概是大多数人的配置心态:我们以为「更多功能 = 更好」,但实际上「刚刚好 = 最好」。
fish 的出现:一套开箱即用的体验#
2023 年我换到了 fish shell。
说实话,转过去的理由很简单:我受够了每次写 if 语句都要查语法,厌倦了配置文件里的那些丑陋的判断逻辑。Fish 的开箱即用体验超出了我的预期——语法高亮、智能提示、自动补全、语法简洁,这些在其他 shell 里需要花大量时间配置的功能,fish 装完就有。

fish 的提示符默认已经包含了 Git 状态和分支名,够用了,没有冗余信息。配置命令是交互式的,运行一次 fish_config,浏览器里就能调整提示符风格、颜色、功能开关,不需要改配置文件,不需要重启终端。
当然,也有代价。Fish 的语法和 POSIX 不完全兼容——这意味着一些老的 bash 脚本需要修改或者加 #!/usr/bin/env fish 才能跑。但说实话,这类脚本在日常开发中越来越少见了。我的工作流以 Node.js、Python 为主,这些都不依赖 shell 语法。真正影响我的,是 ls | grep foo 这类管道命令——Fish 里写成 ls | grep foo 同样工作。
我现在的配置:简单到令人发指#
现在我的 fish 配置大概是这样:
- 默认主题 + 轻微的配色调整
- 关闭了 fish 的自动建议(autosuggestion),因为我发现自己经常需要清空重来,自动建议反而分散注意力
- 安装了
fzf用于快速查找命令历史,这个是最有价值的一个插件 - 一个简单的别名:
ll ls -lah
没了。真的没了。插件数量一只手数得过来,没有主题,没有启动脚本优化,没有 Oh My Fish。
你猜怎么着?终端启动速度是原来 oh-my-zsh 的五分之一不到,我的注意力不再被花里胡哨的状态栏分散,命令补全比 oh-my-zsh 最鼎盛时期还要快。Fish 自带的语法检查还会给错误的命令标红,告诉我哪里写错了。
我删掉 oh-my-zsh 的那天,.zshrc 文件有 800 多行。两年后,我的 config.fish 只有 40 行。
折腾教会我的事#
回过头看这段折腾历程,我最大的收获不是学会了 zsh 配置,而是弄清了自己的真正需求。
当我在 oh-my-zsh 的泥潭里挣扎时,我误把「更多插件」当成「更高效率」。但效率从来不是工具给你的,而是你用工具产出的成果除以你花的时间。
一个「刚刚好够用」的终端,让你把省下来的注意力拿去真正做事。这才是效率。
如何选择你的 Shell:一个实用建议#
说了这么多,如果你正在考虑换 shell,我给你一个实用的判断框架,而不是「推荐你用 xxx」——
先问自己三个问题:
- 我每天打开终端多少次?打开时主要做什么?
- 我现在的 shell 有什么具体问题让我不爽?是启动慢、补全差,还是配色不习惯?
- 我愿不愿意花时间去维护一套自定义配置?
如果你的痛点是「启动慢、插件冲突」,换一个更省心的 shell(如 fish)确实值得。如果你的痛点是「语法不习惯、写脚本有问题」,你需要的可能是更深入地学习 bash/zsh,而不是换。
如果你和我一样,不想花时间维护配置,只想打开终端就能干活——fish 是目前最省心的选择。但如果你享受折腾配置的过程,zsh + oh-my-zsh 也是一个完全合理的选项。
重要的是:不要让配置成为你工作的一部分,让配置为你工作。
工具是用来干活的,不是用来折腾的。这句话听起来像废话,但花几年时间才真正理解它,才知道它真的不是废话。