bat 是一个带语法高亮的分页器,主程序 7342592 字节,替代的是 cat。敲 bat 文件名,它给你行号、代码着色和顶部一行文件名,滚动超过一屏时交给分页器。

它解决的问题是「看一眼文件内容,结果糊成一坨」。用 cat 看两千行的日志,颜色没有,行号没有,翻页也没有,只能靠 grep 和 head 反复切。bat 把这些默认打开,一次读完。

这次在一台 Windows 10 22H2 上跑了完整一轮:解压 0.06 秒,版本命令 172 毫秒,渲染一份 29892 字节的 Python 文件耗时 204 毫秒,输出被 ANSI 转义撑到 188816 字节。

一个 7342592 字节的分页器

官方 zip 3613318 字节,解开 11 个条目。除主程序外还有 man 手册 / README / LICENSE / 一套 shell 补全脚本,补全那部分在 Windows 上用不上,可以直接删。

文件字节作用
bat.exe7342592主程序,单文件
zip 整体3613318解压后 11 个条目
autocomplete\4 个脚本bash / zsh / fish / PowerShell
LICENSE1091MIT 或 Apache-2.0 双授权

版本命令 172 毫秒

连跑三次分别是 174 毫秒 / 160 毫秒 / 172 毫秒。第一次多出来的十几毫秒是杀毒软件扫描新 exe,之后稳定在一百七十毫秒上下。

# 三次耗时 174 / 160 / 172 毫秒
bat --version
bat 0.26.1 (979ba22)

输出只有一行,括号里是提交短哈希。想确认包没被动过,比 zip 的 sha256 比看这行更可靠。

装之前只需要一个终端

它没有运行时依赖,也不需要先装 Rust。真正要注意的是终端本身的三件事。

条件本次实测值不满足会怎样
系统Windows 10 22H2(19045.6466)官方只给 x64 与 arm64 的 msvc 包
代码页chcp 65001默认 936 时中文注释变乱码
字体Consolas 等宽比例字体会把行号挤歪
授权MIT / Apache-2.0可商用,可再分发

zip 只有 3613318 字节,因为语法定义、配色和主题都编译进了 exe。183 种语言的支持全在里面,不需要额外下插件。

高亮要花 204 毫秒

同一份 29892 字节、1204 行的 Python 文件,开高亮跑三次是 246 / 201 / 204 毫秒,关掉高亮(-pp)是 161 / 161 / 162 毫秒。差值四十毫秒左右,就是逐行着色的开销。

# 开高亮   246 / 201 / 204 毫秒
# 纯文本   161 / 161 / 162 毫秒(-pp)
# 输入     29892 字节 / 1204 行
# 输出     188816 字节(--color=always)
跑法耗时产物
开高亮(--color=always)201 毫秒188816 字节
纯文本(-pp)162 毫秒29892 字节
主题数28 套--list-themes
支持语言183 种--list-languages

29892 字节怎么变成 188816

差距全在 ANSI 转义序列。每个关键字和字符串,连注释前后都插一段颜色控制码,一行代码可能被切十来段,字节数就翻到六倍。

这也解释了为什么它不能当 cat 用在管道里:重定向到文件以后,那些转义码会原样留在文本里,下游程序读到的是乱字符。

# 六倍体积的来源
bat --color=always big.py > out.txt   # 188816 字节
bat -pp big.py > out.txt              # 29892 字节

28 套主题与 183 种语言

两条命令就能把家底列清楚。主题决定配色,语言决定哪些文件会被着色,两个列表都不长,扫一眼就知道够不够用。

bat --list-themes          # 28 套,含 TwoDark、Monokai Extended 等
bat --list-languages       # 183 种,含 Python、JSON、TOML、Markdown
bat --theme=TwoDark demo_show.py
bat --language=json data.txt   # 后缀不对时手动指定

后缀不对时手动指定语言

配置文件叫 .env 或者没有后缀时,它认不出语言,整份按纯文本输出。加 --language=json 这类参数就正常了,比改文件名省事。

主题只影响界面观感,不影响输出内容。写文档截图时换一个亮色主题,比在图片编辑器里调色省时间。

和系统自带命令的分工

Windows 自带的三个命令各管一段,bat 补的是最后那段没人做好的部分。

命令行号语法高亮分页
type无无无
more无无有一屏一停
bat -pp无无有
bat有有有
同一文件输出字节188816—29892(-pp)

脚本里还是用 type 或 cat

bat 的默认输出带转义码,风格偏给人看。批处理里做字符串拼接时用它,产物会带上颜色控制符,后面解析容易出错。

实测那 188816 字节的输出里,真正的内容仍然是 29892 字节,多出来的全是控制码。这组数字就是判断依据。

四个真会踩的地方

输出到管道以后颜色没了

bat 检测到 stdout 不是终端,会自己降级成纯文本。想保留颜色必须显式加 --color=always,代价是产物里混入转义码。

大文件一路刷屏到头

没装 less 时它不做交互分页,1204 行一次全打出来,屏幕上只剩最后三十行。加 --paging=never 至少是可控的,想看开头就配 | more。

顶部只显示文件名

实测头部那一行只有 File: demo_show.py,不含大小与语言。想看体积还是用 dir,别指望这一行。

中文注释变成问号

conhost 默认代码页是 936,bat 输出 UTF-8 时中文会乱。先 chcp 65001 再跑,字体换成等宽中文字体,注释才正常显示。

什么场景值得上

经常在终端里读配置和日志,或者读别人提交的代码片段,这类人最合适。204 毫秒渲染 1204 行,比开编辑器快,也不用担心改到文件。

写技术文档时也顺手。截图里那行行号、网格和配色是它的默认输出,不用再排版。

反过来,纯粹想把文件内容拼进管道、或者做批量文本处理,用 type 更合适。bat 的价值在「人看」,不在「机器读」。

项目数值
exe 字节7342592
zip 字节3613318
渲染 1204 行204 毫秒
纯文本模式162 毫秒