bat 完全实战指南:让 cat 拥有语法高亮、Git 集成与智能分页的终端文件查看器
bat 是一个带"翅膀"的 cat(1) 克隆:在保持 cat 核心语义(读取、拼接、重定向)的基础上,叠加了基于 Sublime Text 语法的高亮、Git 变更标记、非打印字符可视化与自动分页等能力。本文基于仓库内的官方俄语文档(doc/README-ru.md)整理,并结合当前仓库源码(src/ 目录)逐项验证了文档中描述的机制——包括分页参数如何注入、配置文件路径如何解析、自定义语法缓存如何构建——帮助你不仅会用 bat,还能理解它"为什么这样工作",并在生产终端环境中稳定部署。
一、核心能力:五件 cat 做不到的事
1. 语法高亮
bat 支持大量编程语言与标记语言的高亮,底层基于 Sublime Text 的 .sublime-syntax 语法文件。仓库中内置的语法资产位于 assets/syntaxes/01_Packages 与 assets/syntaxes/02_Extra(例如 02_Extra 下包含 TOML、Nginx、Docker、Tcl 等几十个目录与独立语法文件),并在构建时打包进二进制缓存。
2. Git 集成
bat 会调用 git 获取工作区变更,在左侧栏(gutter)用色块标出已修改行。从源码看,这一逻辑位于 Git 差异计算:只有当 --diff(diff 模式)或样式组件包含 changes 时,才对普通文件调用 get_git_diff,未修改的文件在 diff 模式下会被整体跳过——这与文档"无变更文件不显示"的行为一致。
3. 非打印字符可视化
使用 -A / --show-all 可以把制表符、行尾符、控制字符等可视化,例如 bat -A /etc/hosts。这一行为由 非打印字符表示模块 驱动。
4. 自动终端分页
当输出超过一屏时,bat 会自动把输出交给分页器(默认 less)。从源码结构看,分页模式定义在 PagingMode:Always、QuitIfOneScreen、Never 三种,枚举默认值是 Never(即"仅当输出可能超屏时"的自动语义在 输出类型选择 中按配置映射)。若想让它始终像 cat 一样直通,可加 --paging=never,或设置为 cat 的别名:
alias cat='bat --paging=never'
一个容易忽略的细节:控制流 表明,如果命令行给出的输入文件全部不存在,bat 不会启动分页器——避免为一条报错信息卡在分页界面里。
5. 多文件合并
bat 保留 cat 的拼接语义。当检测到非交互终端(输出被重定向到文件或管道)时,它自动退化为纯文本输出(无高亮),因此 bat a.md b.md > doc.md 得到的是干净的合并结果。
二、基本用法
查看单个文件:
> bat README.md
一次查看多个文件:
> bat src/*.rs
从 stdin 读取并自动探测语法(依据首行 shebang,如 #!/bin/sh):
> curl -s https://sh.rustup.rs | bat
从 stdin 读取并显式指定语言(管道中没有文件名可用,需要 -l 帮助识别):
> yaml2json .travis.yml | json_pp | bat -l json
显示不可见字符:
> bat -A /etc/hosts
作为 cat 的替代场景:
bat > note.md # 从 stdin 立即创建新文件
bat header.md content.md footer.md > document.md # 合并多个文件
bat -n main.rs # 只显示行号
bat f - g # 依次输出 f、stdin、g('-' 代表 stdin)
三、与其他工具集成
作为 fzf 的预览器
bat 可作为 fzf 的预览命令。关键是加 --color=always 强制输出彩色;对大文件用 --line-range 限制高亮范围以降低加载延迟:
fzf --preview "bat --color=always --style=numbers --line-range=:500 {}"
与 find / fd 批量预览
find … -exec bat {} + # find 的 -exec
fd … -X bat # fd 的 -X/--exec-batch
与 ripgrep 配合
社区工具 batgrep(bat-extras 项目提供)可以让 ripgrep 的命中结果以带高亮的上下文形式呈现:
batgrep needle src/
实时跟踪日志:tail -f
tail -f /var/log/pacman.log | bat --paging=never -l log
两个前提条件缺一不可:--paging=never(持续追加的输出不能进分页器);-l log(stdin 无文件名,语法无法自动探测,需显式声明)。
查看 Git 历史版本
git show v0.6.0:src/main.rs | bat -l rs
带上下文的 git diff
把 diff 过滤后的变更文件送入 bat --diff,即可看到变更行高亮及其上下文:
batdiff() {
git diff --name-only --relative --diff-filter=d -z | xargs -0 bat --diff
}
更完整的 diff/git 集成可以考察 delta 这类工具;bat-extras 中也有独立的 batdiff 可执行文件。
复制到剪贴板
行号与变更标记会污染复制内容。此时用 -p / --plain 或依赖 bat 的自动检测——重定向后输出即变为纯文本:
bat main.cpp | xclip
美化 man 页
通过 MANPAGER 让 man 输出经过 bat 上色:
export MANPAGER="sh -c 'col -bx | bat -l man -p'"
man 2 select
注意:Debian/Ubuntu 上二进制可能叫 batcat(见下文),需替换命令中的 bat;若格式异常可再设 MANROFFOPT="-c";使用 batman(bat-extras)可一条命令完成全部配置。另外,仓库中的 manpage 语法 Manpage.sublime-syntax 仍在持续打磨;基于 Mandocs 实现的 man 与该方案目前不兼容。
格式化后查看:prettybat
Prettybat(bat-extras 提供)先调用 prettier / shfmt / rustfmt 等格式化器,再用 bat 高亮输出,适合"格式化结果预览"。
高亮 --help 帮助文本
bat 内置 help 语法,可以给任意命令的帮助文本上色:
$ cp --help | bat -plhelp
或写入 shell 配置(.bashrc/.zshrc):
alias bathelp='bat --plain --language=help'
help() {
"$@" --help 2>&1 | bathelp
}
之后 help cp、help git commit 即可得到带色帮助。zsh 用户还可声明全局别名,让所有命令的 -h/--help 直接带色:
alias -g -- -h='-h 2>&1 | bat --language=help --style=plain'
alias -g -- --help='--help 2>&1 | bat --language=help --style=plain'
注意:-h 并不总是 --help 的缩写(ls 就是反例)。帮助文本高亮的问题应向对应的 help 语法仓库反馈。
四、安装
Linux 各发行版
| 发行版 | 命令 | 备注 |
|---|---|---|
| Ubuntu / Debian(apt) | apt install bat |
Ubuntu 20.04 (Focal) 起、Debian 11 (Bullseye) 起提供 |
| Alpine | apk add bat |
官方源 |
| Arch Linux | pacman -S bat |
官方源 |
| Fedora | dnf install bat |
来自 Fedora Modular |
| Gentoo | emerge sys-apps/bat |
官方源 |
| Void Linux | xbps-install -S bat |
— |
| FreeBSD | pkg install bat 或 cd /usr/ports/textproc/bat && make install |
端口亦可源码编译 |
| OpenBSD | pkg_add bat |
— |
| openSUSE | zypper install bat |
— |
batcat 命名坑:在部分 Debian/Ubuntu 上,为避免与另一个 bat 包冲突,二进制被命名为 batcat。可以建一个符号链接规避:
mkdir -p ~/.local/bin
ln -s /usr/bin/batcat ~/.local/bin/bat
安装最新 .deb:当发行版仓库版本过旧时,可下载官方 release 的最新 deb 包:
sudo dpkg -i bat_0.18.3_amd64.deb # 按实际架构与版本替换
跨平台方案
nix-env -i bat # nix
flox install bat # Flox
brew install bat # Homebrew(macOS / Linux)
port install bat # MacPorts(macOS)
Windows
前置要求:安装 Visual C++ Redistributable。任选一种包管理器:
winget install sharkdp.bat # WinGet
choco install bat # Chocolatey
scoop install bat # Scoop
也可以直接下载 release 页的预编译包;静态链接版本选择文件名带 musl 的归档。
从源码构建
源码构建需要 Rust 1.79.0 或更高,然后用 cargo 编译安装:
cargo install --locked bat
注意:该方式不会安装 man 文档与 shell 补全文件;它们会在构建过程中生成到 build 目录。补全脚本模板见 assets/completions/(bash/zsh/fish/PowerShell 四种 .in 模板),可用命令直接输出:
bat --completion <shell> # 支持的 shell 见 --help
五、定制化
主题选择
bat --list-themes # 列出全部可用主题
通过 --theme=TwoDark、环境变量 BAT_THEME(在 shell 配置中 export BAT_THEME="TwoDark")或配置文件三选一持久化。仓库内置主题资产位于 assets/themes/(OneHalfDark、Nord、gruvbox、Catppuccin 等,以 .tmTheme 格式提供),补丁式修复在 assets/patches/ 中。
配合 fzf 可以交互式预览主题:
bat --list-themes | fzf --preview="bat --theme={} --color=always /path/to/file"
浅色终端建议使用 GitHub 或 OneHalfLight 这类浅色主题。
输出样式
--style 控制输出外观,各组件可组合:
bat --style=numbers,changes,header # 行号 + Git 变更 + 文件头
持久化方式:环境变量 BAT_STYLE 或配置文件。
添加自定义语法
bat 的高亮引擎是 syntect,它能读取 Sublime 的 .sublime-syntax 文件与 .tmTheme 主题。添加新语法的完整流程:
mkdir -p "$(bat --config-dir)/syntaxes"
cd "$(bat --config-dir)/syntaxes"
# 把 .sublime-syntax 文件放入该目录(或子目录),例如克隆某个语法仓库
bat cache --build # 编译成二进制缓存
bat --list-languages # 验证新语言已出现
想恢复默认行为:
bat cache --clear
添加自定义主题
mkdir -p "$(bat --config-dir)/themes"
cd "$(bat --config-dir)/themes"
# 下载/克隆 .tmTheme 主题文件
bat cache --build
bat --list-themes
自定义分页器
bat 优先读取 BAT_PAGER,其次 PAGER,缺省为 less:
export BAT_PAGER="less -RF"
也可以写入配置文件的 --pager 选项。
关于默认分页参数的机制:文档称"默认 less 会附加 -R、-F,旧版本再加 -X(--no-init)"。源码证实并补充了更多细节——分页器启动逻辑 中:
-R(--RAW-CONTROL-CHARS):让less原样透传 ANSI 颜色;-F(--quit-if-one-screen):输出不足一屏时直接退出,省掉按q;-K(--quit-on-intr):保证Ctrl-C同时终止bat与less(BusyBox 版less不支持,故跳过);--no-init仅在less < 530(Windows 上< 558)时追加——它修复旧版less的 quit-if-one-screen 缺陷,但代价是禁用鼠标滚轮;- 同时设置
LESSCHARSET=UTF-8并追加--no-lessopen,防止 less 重复预处理。
值得注意的一个精妙设计:当用户只在通用变量 PAGER 中写了 less(未带参数),bat 会覆盖其参数补上上述标志;但对 BAT_PAGER 或 --pager 显式给出的参数则原样信任(见 参数替换条件 中 replace_arguments_to_less 的判断)——即"你给 bat 的专属设置,bat 绝不多嘴"。less 版本探测实现见 retrieve_less_version,含 487/529/551/581 等版本解析的单测。如果你用的是较新版本 less 并想恢复鼠标滚动,可参考生成的默认配置模板中的建议行:
#--pager="less --RAW-CONTROL-CHARS --quit-if-one-screen --mouse"
该模板行直接来自源码中的 默认配置文件内容。
跟随 macOS 深色/浅色模式
alias cat="bat --theme=\$(defaults read -globalDomain AppleInterfaceStyle &> /dev/null && echo default || echo GitHub)"
六、配置文件
bat 的配置文件位置跨平台不同,用这条命令直接查询:
bat --config-file
可用 BAT_CONFIG_PATH 覆盖路径,目录本身也可用 BAT_CONFIG_DIR 覆盖(见 目录解析):
export BAT_CONFIG_PATH="/path/to/bat.conf"
生成带注释的默认模板:
bat --generate-config-file
若模板已存在,bat 会询问是否覆盖(对应 生成逻辑 中的 Overwrite? (y/N) 交互);此外系统级配置位于 /etc/bat/config(Windows 为 C:\ProgramData\bat\config,见 system_config_file),用于团队级统一策略。
格式:配置文件就是若干命令行参数,每行一个,# 开头为注释。全部可选参数见 bat --help。官方文档给出的示例:
# 使用 "TwoDark" 主题
--theme="TwoDark"
# 显示行号、Git 变更和文件头
--style="numbers,changes,header"
# 使用斜体(并非所有终端都支持)
--italic-text=always
# 让所有 Arduino .ino 文件使用 C++ 语法
--map-syntax "*.ino:C++"
# 让 .ignore 文件使用 Git Ignore 语法
--map-syntax ".ignore:Git Ignore"
--map-syntax 是扩展 bat 覆盖面最廉价的手段:仓库内置的映射规则见 src/syntax_mapping/builtins/(按 common/linux/bsd-family 等操作系统族组织的 TOML 文件),当内置规则不满足你的命名习惯时,用配置文件的 --map-syntax 覆盖即可,无需动仓库内容。
七、Windows 使用要点
分页器
Windows 自带只有简陋的 more。可安装 less(独立安装器或 chocolatey 的 Less 包),确保其在 PATH 中,或用 BAT_PAGER 显式指定;Chocolatey 安装会自动处理。
颜色
Windows 10 1511 起,conhost.exe、PowerShell 与 bash 均支持彩色输出;更早版本可用带 ConEmu 的 Cmder。注意:Git/MSYS2 附带的 less 颜色渲染不正确——若无其他分页器,可 --paging=never 或把 BAT_PAGER 设为空串。
Cygwin 路径
bat 不直接理解 /cygdrive/* 形式的 Unix 风格路径,报错形如 The system cannot find the path specified. (os error 3)。解决办法是在 .bash_profile 中包一层函数,用 cygpath --windows 转换文件参数:
bat() {
local index
local args=("$@")
for index in $(seq 0 ${#args[@]}) ; do
case "${args[index]}" in
-*) continue;;
*) [ -e "${args[index]}" ] && args[index]="$(cygpath --windows "${args[index]}")";;
esac
done
command bat "${args[@]}"
}
八、常见问题排查
终端与颜色
bat 同时支持 truecolor 与 8 位色终端,但高亮为 24 位色优化,推荐使用 iTerm2、konsole、terminator 等 truecolor 终端。务必确认 COLORTERM=truecolor(或 24bit),否则 bat 会退回 8 位色输出。
行号/正文看不清
换主题:bat --list-themes 查看全部;OneHalfDark、OneHalfLight 的行号与正文对比度更高。
编码
bat 支持 UTF-8 与 UTF-16,其他编码可能识别错误,建议先转码:
iconv -f ISO-8859-1 -t UTF-8 my-file.php | bat # 例:Latin-1 的 PHP 文件
转码后文件内容经管道传入,可能需要 -l 显式指定语法。
九、从源码构建(开发流程)
# 递归克隆全部子模块
git clone --recursive https://github.com/sharkdp/bat
cd bat
cargo build --bins # 开发模式编译
cargo test # 运行测试
cargo install --locked # 安装 release 版本
# 使用自定义语法/主题集合重新打包
bash assets/create.sh
cargo install --locked --force
其中 assets/create.sh 负责把 assets/syntaxes、assets/themes 编译进二进制;构建资产逻辑在 src/assets/build_assets.rs。测试侧,语法高亮有专门的对照框架(tests/syntax-tests/ 下按语言组织的源文件与高亮产物,配合 regression_test.sh 做回归),分页相关行为有 mocked-pagers 提供 less/more 替身进行模拟。
十、项目目标与选型
bat 的既定目标:美观且高级的语法高亮、Git 集成、作为 cat 的完整替代品、友好一致的命令行接口。若你在 bat 与其他工具(less、most、delta、rg 生态等)之间做取舍,仓库提供了专门的对比文档:doc/alternatives.md。
bat 以 MIT 与 Apache License 2.0 双许可分发,详见 LICENSE-MIT 与 LICENSE-APACHE。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0625
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00