大多数 shell 到今天还在延续同一种交易:先把历史语法原样交给用户,再把舒适感留到后面,用插件、prompt 主题、completion 包和一套慢慢积起来的私人经验去补。fish 有意思,就在于它把这个顺序掉了个头。官方 tutorial 依旧把它介绍成一套带有 syntax highlighting、autosuggestions 和 tab completions 的 shell,而且这些能力从一开始就能工作;设计文档又把话说得更直,discoverability、responsiveness,以及对多余 configurability 的警惕,本来就是这个项目的核心原则。[1][2]
这个框架放到 2026 看,比早年更有分量,因为 fish 已经不像一门“聪明但边缘”的替代 shell,更像一套成熟而且仍在推进的日常工具。以 2026-05-04T01:34:29Z UTC 为准,当前 release notes 列出的最新版本是 fish 4.6.0,发布时间是 2026-03-28。[5] GitHub API 显示 fish-shell/fish-shell 有 33,349 个 stars、2,286 个 forks、541 个 open issues,最近一次 push 时间是 2026-05-04T01:05:01Z。[6] 这些数字当然不能替代判断,却足以说明 fish 早已并非“给厌倦 Bash prompt 的人玩的新鲜玩具”。它有活跃的上游、有稳定推进的发布线,也有足够大的使用面,使得它的设计选择值得被单独读一遍。[5][6]
配图说明:题图没有使用 logo、代码截图,也没有用经过风格化处理的终端想象图,而是回到真实工作台。这个选择和本文的重心吻合,因为 fish 并非一套靠系统图示取胜的项目,它真正提供的价值,发生在用户每天反复与命令行打交道的时间里。[8]
它最先兑现的价值,落在交互本身
理解 fish,最好的起点并非语言参考手册,而是最开始那五分钟。tutorial 把主要赌注摆得很清楚:autosuggestions、syntax highlighting 和 tab completions 默认就在那里,不需要再去拼接一套额外框架。[1] fish_config 可以直接打开一个基于浏览器的配置界面,prompt 主题可以现场查看,文档里的例子也反复回到“输入时能看到什么反馈”这个层面,而没有把注意力拖进 shell 纯洁性争论里。[1]
这让 fish 对长时间待在终端里的人特别有吸引力,因为它想先把最频繁发生的摩擦减下来。外部介绍抓到的也是同一个点。Opensource.com 那篇文章之所以把 fish 的亮点概括成 "beautiful defaults",正因为它在大规模自定义之前,就先给了用户一个已经能顺手工作的交互环境。[7] 这就是最合适的阅读方式。fish 卖的并非“我和别人不一样”这一层新鲜感,它卖的是把日常命令行熟练度建立得更轻一些。[1][7]
这里的重点不在于 Bash 或 Zsh 做不到舒服。它们当然做得到。真正的差别在于 fish 把舒服当作起点。若一套 shell 能在输入时用高亮提示命令是否成立,能按历史和路径把最或许的下一步推到眼前,还能在 completion 列表里附带描述,命令行的气质就会变,从入门仪式感更重的环境,转到一套预期自己会被人每天使用的软件上来。[1][2]
它的语言带着立场,因为维护者想删掉隐性的规则
fish 的第二个主张更硬,也更容易引起分歧:项目愿意放弃一部分 POSIX 继承性,换取更统一的语言表面。当前的 “Fish for bash users” 页面写得很直接:fish 故意不追求 POSIX 兼容。[3] 这句话几乎可以解释它的大部分魅力,也解释它清晰的适用边界。
它换来的,是一致性。那份文档展示了 set 怎样同时承担变量定义、类似 export 的行为、本地作用域和删除动作,而这些工作在别的 shell 里往往散落在几套不同语法与 builtin 之间。[3] 它也把几件很多 shell 用户最后都会害怕的东西重新收束了:fish 不会 在变量展开时做 shell word splitting,用 string 来替代 ${foo%bar} 这一类参数替换技巧,也尽量把 heredoc 这类特殊规则让位给普通的 pipe。[3] 这并非表面上的语法美容,而是在主动移除整类需要靠经验记忆的 shell 暗知识。[2][3]
design 页面把这条路背后的态度说得非常坦白。orthogonality、discoverability、user focus,以及把许多配置开关视作设计失败而并非美德,都是官方明文写下来的原则。[2] 所以 fish 给人的感觉,常常更像一套被设计过的环境,而并非一层兼容外壳。它宁愿保留一条可读的做法,也不愿把几套半重叠的历史形式继续拖在用户手上。[2][3]
这种倾向在配置状态上也很明显。tutorial 和 language 文档都强调了 universal variables:它们会在当前与未来的 fish 会话之间共享,也会跨越重启保存下来。[1][4] 这是一种看上去很小、实际影响很大的能力。很多互动偏好可以直接作为 shell 状态存在,不用每一步都退回到一套手工维护的 dotfile 仪式中去。[1][4] 对于把终端当作长期工作界面的人来说,这件事比再多一张 prompt 截图更有价值。
4.x 这条发布线说明,项目还在磨真正的工作表面
fish 的活力也出现在该出现的地方。4.5.0 的 release notes 做了一个很能说明问题的清理:fish 不再读取 terminfo 数据库来根据 TERM 调整行为,原先那条兼容路径现在被永久视为默认状态。[5] 到了 4.6.0,项目又把注意力拉回交互表面,增加了 prompt prefix、prompt suffix 和 welcome message 这些环境变量入口,同时继续修补一些更细的交互问题。[5] 这种发布节奏很有说服力。项目既愿意继续做底层终端行为的简化,也没有停止打磨人真正摸到的那一层表面。
把这一点和当前仓库活动放在一起看,fish 维持的是一种健康的平衡:它没有把自己包装成“已经完成的 shell”,也没有沉迷于夸张的重写叙事。它仍然在清理那些会让终端行为、prompt 行为和交互反馈变粗糙的地方。[5][6] 对一套日常 shell 来说,这比追逐一次性的宏大革新更可靠。
它的边界很清楚:更适合做人用的 shell,不适合做可移植性的陷阱
让 fish 好用的那些立场,也同时决定了它不适合做一切旧 shell 习惯的通用替身。文档明说了很多 Bash 用户会遇到的变化:quoting、heredoc、prompt 构造、算术处理、subshell 行为,以及对 POSIX 可移植性的默认预期,都得换成 fish 自己的语境来理解。[3] 这并非项目的缺点,而是项目把“让自己的环境更清楚”放在“完整继承旧 shell 文化”之前所付出的代价。[2][3]
所以它的适配面其实很锋利。fish 最强的场景,是开发者工作站、跳板机、运维笔记本这一类由人长期操作的环境,在那里,history、completion、prompt 行为和更可靠的变量展开规则,会每天反复回收注意力成本。[1][3][4] 它在另一类场景里就弱得多:那些要求大面积继承旧部署脚本、供应商示例或者 /bin/sh 路径中 POSIX 行为的地方。[3]
也正因为如此,fish 在 2026 值得被写成一篇项目导读。眼前真正活着的论点,并非它赢了某种抽象的 shell 审美竞赛,而是它把交互式命令行当成产品表面来做,然后又愿意用一套敢于删改旧习惯的语言去支撑这件事。[1][2][3] 若一个团队追求的是最大限度保留既有 shell 片段的继承性,fish 会带来摩擦;若一个团队真正想让每天都在使用的 shell 更清楚、更可发现、也更少依赖插件堆叠,fish 仍然是 OSS 命令行世界里信号最强的一类选择。[1][5][6][7]
来源
- fish-shell tutorial:官方对 autosuggestions、syntax highlighting、tab completions、
fish_config、functions 与 universal variables 的概览。 - fish-shell design document:官方关于 discoverability、responsiveness、orthogonality,以及对多余 configurability 的批判性设计原则。
- fish-shell,《Fish for bash users》:当前版本对 fish 非 POSIX 路线及其在 variables、heredocs、prompts 与语法层面和 Bash 差异的说明。
- fish-shell language documentation:当前版本关于 universal variables 与 shell 语言行为的参考文档。
- fish-shell release notes:当前发布线,包括 2026-03-28 发布的 fish 4.6.0 以及近期 4.x 的交互层变化。
fish-shell/fish-shell的 GitHub API 快照:文章创建时的 stars、forks、open issues、default branch 与最近 push 时间。- Opensource.com,《Drop Bash for fish shell to get beautiful defaults》:从外部角度理解 fish 如何把价值集中在默认体验与日常交互上。
- Wikimedia Commons,《File:A Programmer's Workstation.JPG》:本文题图所用真实工作台照片的来源页。