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.exe | 7342592 | 主程序,单文件 |
| zip 整体 | 3613318 | 解压后 11 个条目 |
| autocomplete\ | 4 个脚本 | bash / zsh / fish / PowerShell |
| LICENSE | 1091 | MIT 或 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 毫秒 |








