60,619 颗星、八年仍在每周迭代:bat 把「在终端里读代码」这件事单独做好了
如果你在终端里读代码,大概不止一次把 cat 的输出刷满整屏,然后又滚回去找那几行。bat 就是为了这一半场景存在的。
它由 David Peter(sharkdp,也是 fd、hyperfine 的作者)在 2018 年 4 月创建,用 Rust 写成,目前 60,619 stars / 3,012 forks / 529 open issues,最近一次代码推送就在今天(2026-10-01),许可证是宽松的 Apache-2.0。仓库地址:https://github.com/sharkdp/bat
它到底改了什么
bat 的自我定位非常克制——README 里写的是 “A cat(1) clone with syntax highlighting and Git integration”,加一个不打算越界的后缀:它解决的是人读文件,不是脚本里拼接文件。
具体几件实事:
- 语法高亮:基于
syntect,直接读 Sublime Text 的.sublime-syntax定义,覆盖 200+ 语言和标记格式,包括 YAML、TOML、Dockerfile、SQL 这些”你天天看却没几个人给它配高亮”的文件。仓库里assets/syntaxes/和assets/themes/放的就是定义和主题。 - Git 集成:在一个 git 仓库里
bat somefile.py,左侧 gutter 会标出相对 index 的新增/修改行。等于不离开 shell 就有一个轻量”我改了什么”视图。 - 自动分页:长文件自动交给
less,不用再自己接管道。 - 不可见字符:
bat -A /etc/hosts能把制表符、行尾符标出来,排查格式问题时很顺手。 - 上下文感知:这是最该被注意的一条。一旦检测到输出被管道接走或重定向到文件,它立刻退回纯
cat行为,只吐原始字节。所以bat file.json | jq和cat file.json | jq结果一致,把它 alias 成cat也不会把脚本搞崩。
最新三个版本看下来,项目仍在稳定迭代:v0.25.0(2025-01,加入 --squeeze-blank 压缩空行)、v0.26.0(2025-10,加入 Windows/ARM64 构建、负向行区间、内置 minus pager)、v0.26.1(2025-12,主要是 help 分页、主题配置读取、Docker 语法等修复)。没有激进重构,属于”能不动就不动,动就修真问题”的维护节奏。
边界:哪些事它不做
很多介绍把 bat 说成”cat 的升级替代”,这个说法会害人。
bat 官方明确不打算替代脚本里的 cat。第一,管道里它本来就会退化成纯文本,装饰全丢;第二,大文件上它比 cat 慢,因为它要做语言检测和着色。真要在 shell 脚本里做确定性、无修饰的输出,还是用 cat 或者直接重定向。
另外它不是 diff 工具。Git 标记只显示相对 index 的变化,想看详尽的差异审阅,作者自己推荐的是 delta。同理,搜代码应该用 ripgrep,bat 只负责”把结果好看地渲染出来”。
真实使用门槛
安装本身基本零门槛:macOS brew install bat,Arch pacman -S bat,或者 cargo install bat。
但有一个坑必须提前知道:Debian/Ubuntu 上 apt install bat 装出来的可执行文件叫 batcat,不叫 bat,因为系统里 /usr/bin/bat 被另一个包占了。这是新手最高频的”命令找不到”来源。解决办法是在 shell 配置里加 alias bat=batcat。Ubuntu 从 20.04(Focal)、Debian 从 11(Bullseye)起官方仓库就有,其他平台去 releases 页下预编译二进制。
第二个门槛是终端真彩色。主题要显示正常,得用支持 true color 的终端模拟器;老终端下色彩会发灰。默认主题在某些浅色/深色背景下观感一般,用 bat --list-themes 挑一个并写进 ~/.config/bat/config 就行。
第三个是上手习惯:把它 alias 成 cat 时记得带 --paging=never,否则交互式读文件会进 pager,脚本里虽然会自动退化,但 alias 场景下仍可能让你困惑。
适合谁 / 不适合谁
适合:每天在终端里翻源码、看配置、查日志的开发者;运维/SRE 检查带特殊字符的配置文件;想给 fzf、man、ripgrep 结果套上高亮的人。它也常被评为”值得永久 alias”的工具之一。
不适合:需要严格可预测输出的 CI/脚本流水线(那里用 cat);想做复杂 diff 审阅(用 delta);纯做代码搜索(用 ripgrep);以及完全在 IDE 里读文件、很少碰终端的人。
顺手可用的几个组合
README 里已经给了现成的:
# 作为 fzf 预览器,限制加载行数避免卡顿
fzf --preview "bat --color=always --style=numbers --line-range=:500 {}"
# 给 man 页面加高亮
export MANPAGER="bat -plman"
# 高亮查看某个历史版本的文件
git show v0.6.0:src/main.rs | bat -l rs
下一步建议
如果你还没装,花两分钟:brew install bat(或对应平台命令),先跑 bat --list-themes 定个主题写进 ~/.config/bat/config,再考虑把 cat alias 过去并加 --paging=never。
已经装了的话,值得再看一眼 --line-range(大文件只高亮某段)和 --squeeze-blank(压掉多余空行),这两个在日常读日志时比想象中好用。想判断它值不值得留在工具箱,最快的办法是找一份你最常读的配置文件——YAML 或者 TOML 那种——分别用 cat 和 bat 各读一遍,直观差距就是答案。
仓库:https://github.com/sharkdp/bat | 中文说明:https://github.com/sharkdp/bat/blob/master/doc/README-zh.md
评论区
登录后可评论。