命令行工具
sharkdp/bat avatar
sharkdp/bat

bat:让 cat 命令拥有语法高亮与 Git 集成

一只带翅膀的猫(1)克隆体。如果您正在寻找对 git 和 diff 操作的更多支持,请查看 delta。

60,450 个 Star1,648 个 ForkRustApache-2.0
GitHub

秒懂

它是什么?
bat 是一个用 Rust 编写的 cat 克隆,为终端文件查看带来语法高亮、Git 状态标记和自动分页。本文基于其 README 与仓库信息,分析它的实际用法、适用场景与局限。
适合谁用?
bat 适合日常在终端查看代码、日志和配置文件,并希望获得语法高亮与行号的开发者。它不适合需要完全保持 cat 行为的脚本环境,除非显式设置 --paging=never 或依赖非交互终端自动回退。
能商用吗?
可以。Apache-2.0 是宽松许可证:你可以使用、修改并销售基于它的软件,只需保留版权和许可证声明。
还在维护吗?
在维护。仓库最近一次提交在 11 天前。
用什么语言写的?
主要是 Rust(依据 GitHub 的语言统计)。

以上回答依据项目的 GitHub 数据(最近同步于 2026年9月14日)和我们的分析,不构成法律意见。

开源项目深度解析

它解决什么问题

cat 命令本身没有语法高亮,也没有任何 Git 集成。bat 的出现就是为了填补这两个空白。它面向的是那些每天在终端里查看源代码、配置文件和日志的开发者。对于他们来说,cat 输出黑白一片,行号要靠外部工具,文件修改状态更是无从得知。bat 把这三件事合并成一个命令,同时保持与 cat 的基本行为兼容。它不是要取代 cat 的全部功能,而是要让终端阅读体验更接近现代编辑器。

核心机制:语法检测与 Git 标记

bat 的语法高亮依赖于内置的语法定义,它支持大量编程和标记语言。从 README 的示例看,它通过文件扩展名或首行内容(如 shebang)自动检测语法。对于 stdin 输入,如果第一行没有 shebang,自动检测可能失败,这时需要手动指定语言,例如 bat -l json。Git 集成方面,bat 会与 git 通信,在左侧边栏显示相对于索引的修改标记。这意味着当你查看一个已跟踪文件时,新添加和删除的行会有视觉标识。这个机制与编辑器中的 diff 视图类似,但直接在终端输出中呈现。

安装与基本用法

bat 通过 crates.io 发布,最新版本是 v0.26.1。安装方式包括 cargo install bat 或使用各发行版包管理器。注意在 Debian 和 Ubuntu 上,可执行文件名可能是 batcat 而非 bat。基本用法与 cat 几乎一致:bat README.md 显示单个文件,bat src/*.rs 显示多个文件。它支持从 stdin 读取,例如 curl -s https://sh.rustup.rs | bat,也可以指定语言。文件拼接同样可行,bat header.md content.md footer.md > document.md 会把三个文件内容合并输出。关键行为是:当输出重定向到非交互终端时,bat 自动禁用分页和高亮,行为退化为 cat。

分页与配置:何时关掉分页

默认情况下,如果输出超过一屏,bat 会调用分页器(如 less)。这对交互式查看很友好,但对脚本或管道可能造成困扰。README 明确建议,如果你希望 bat 永远像 cat 一样不翻页,可以设置 --paging=never,或通过配置文件。对于 alias cat='bat --paging=never',这是推荐的用法。另一个场景是 tail -f /var/log/pacman.log | bat --paging=never -l log,这里必须关闭分页,否则实时输出会被分页器截断。配置项可以通过命令行或配置文件设置,但 README 未给出配置文件的具体路径和格式,需要查看文档或运行 bat --help 获取。

与其他工具的组合:fzf、fd、man

bat 的价值很大程度体现在与其他工具的协作。作为 fzf 的预览器,它使用 --color=always 强制输出颜色,配合 --line-range=:500 限制加载行数,可以快速预览长文件。find -exec bat {} + 或 fd -X bat 可以批量查看搜索结果。对于 man 手册,设置 MANPAGER="bat -plman" 可以让手册页获得高亮,但 README 也提到 Manpage 语法仍在完善中。另一个实用技巧是让 --help 输出高亮:alias bathelp='bat --plain --language=help',然后用 help cp 这样的函数包装。这些组合展示了 bat 如何从单一工具变成终端工作流的增强组件。

局限与失败模式

bat 并非没有短板。首先,它的语法自动检测在 stdin 场景下依赖首行 shebang,如果输入没有可识别标识,高亮会失效,必须手动指定 -l。其次,分页行为可能干扰管道操作,虽然非交互终端会自动回退,但如果你在交互脚本中忘记设置 --paging=never,输出可能意外被分页器截断。第三,bat 的 Git 集成只显示相对于索引的修改,不提供完整的 diff 视图,对于复杂差异查看,README 直接指向 delta。最后,在旧版 Debian/Ubuntu 上可执行文件名不同,可能导致脚本中的 bat 调用失败。这些限制意味着 bat 更适合交互式使用,而不是作为通用脚本工具。

替代方案:与 delta 的定位差异

README 明确提到,如果你需要更多 Git 和 diff 操作支持,应该使用 delta。delta 专注于 diff 的渲染,提供更丰富的色彩、侧边栏和合并冲突标记。而 bat 的核心是文件查看,Git 集成只是辅助功能。两者在架构上不同:bat 是 cat 的增强,delta 是 diff 的增强。实际选择取决于你的主要需求。如果你每天查看大量文件内容,bat 更合适;如果你主要精力在代码审查和 diff 阅读,delta 是更好的选择。值得注意的是,bat 可以通过 batdiff 函数与 git diff 结合,但那是临时方案,不如 delta 专门优化。

维护与许可证

bat 采用 Apache-2.0 许可证,这对商业使用友好,但具体条款需自行确认。项目活跃,最近一次发布是 2025 年 12 月的 v0.26.1,说明维护持续进行。升级方面,由于 bat 依赖内置语法定义,新版本可能更新语法文件,这可能导致高亮结果变化。对于脚本环境,升级后应测试 --paging=never 等行为是否保持。配置迁移通常简单,因为配置选项相对稳定,但建议查看 changelog 确认是否有破坏性变更。总体而言,bat 的维护成本低,但作为依赖 Rust 生态的工具,安装和升级需要 cargo 或包管理器支持。

编辑结论

bat 适合日常在终端查看代码、日志和配置文件,并希望获得语法高亮与行号的开发者。它不适合需要完全保持 cat 行为的脚本环境,除非显式设置 --paging=never 或依赖非交互终端自动回退。若你主要处理 git diff 和复杂补丁,应优先考虑 delta,而不是 bat。在采用前,先确认你的发行版包名(例如 Debian/Ubuntu 可能为 batcat),并测试 bat --diff 是否满足你的差异查看需求。bat 的配置通过 --config-file 或环境变量管理,升级时注意语法定义文件的兼容性。

官方来源

  1. Official README
  2. Project repository
  3. Release notes
社区笔记

社区笔记