首页
/ bat 完全实战指南:让 cat 拥有语法高亮、Git 集成与智能分页的终端文件查看器

bat 完全实战指南:让 cat 拥有语法高亮、Git 集成与智能分页的终端文件查看器

2026-09-05 13:30:32作者:瞿蔚英Wynne

bat 是一个带"翅膀"的 cat(1) 克隆:在保持 cat 核心语义(读取、拼接、重定向)的基础上,叠加了基于 Sublime Text 语法的高亮、Git 变更标记、非打印字符可视化与自动分页等能力。本文基于仓库内的官方俄语文档(doc/README-ru.md)整理,并结合当前仓库源码(src/ 目录)逐项验证了文档中描述的机制——包括分页参数如何注入、配置文件路径如何解析、自定义语法缓存如何构建——帮助你不仅会用 bat,还能理解它"为什么这样工作",并在生产终端环境中稳定部署。

一、核心能力:五件 cat 做不到的事

1. 语法高亮

bat 支持大量编程语言与标记语言的高亮,底层基于 Sublime Text 的 .sublime-syntax 语法文件。仓库中内置的语法资产位于 assets/syntaxes/01_Packagesassets/syntaxes/02_Extra(例如 02_Extra 下包含 TOMLNginxDockerTcl 等几十个目录与独立语法文件),并在构建时打包进二进制缓存。

2. Git 集成

bat 会调用 git 获取工作区变更,在左侧栏(gutter)用色块标出已修改行。从源码看,这一逻辑位于 Git 差异计算:只有当 --diff(diff 模式)或样式组件包含 changes 时,才对普通文件调用 get_git_diff,未修改的文件在 diff 模式下会被整体跳过——这与文档"无变更文件不显示"的行为一致。

3. 非打印字符可视化

使用 -A / --show-all 可以把制表符、行尾符、控制字符等可视化,例如 bat -A /etc/hosts。这一行为由 非打印字符表示模块 驱动。

4. 自动终端分页

当输出超过一屏时,bat 会自动把输出交给分页器(默认 less)。从源码结构看,分页模式定义在 PagingModeAlwaysQuitIfOneScreenNever 三种,枚举默认值是 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 页

通过 MANPAGERman 输出经过 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 cphelp 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 batcd /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/OneHalfDarkNordgruvboxCatppuccin 等,以 .tmTheme 格式提供),补丁式修复在 assets/patches/ 中。

配合 fzf 可以交互式预览主题:

bat --list-themes | fzf --preview="bat --theme={} --color=always /path/to/file"

浅色终端建议使用 GitHubOneHalfLight 这类浅色主题。

输出样式

--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 同时终止 batless(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 位色优化,推荐使用 iTerm2konsoleterminator 等 truecolor 终端。务必确认 COLORTERM=truecolor(或 24bit),否则 bat 会退回 8 位色输出。

行号/正文看不清

换主题:bat --list-themes 查看全部;OneHalfDarkOneHalfLight 的行号与正文对比度更高。

编码

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/syntaxesassets/themes 编译进二进制;构建资产逻辑在 src/assets/build_assets.rs。测试侧,语法高亮有专门的对照框架(tests/syntax-tests/ 下按语言组织的源文件与高亮产物,配合 regression_test.sh 做回归),分页相关行为有 mocked-pagers 提供 less/more 替身进行模拟。

十、项目目标与选型

bat 的既定目标:美观且高级的语法高亮、Git 集成、作为 cat 的完整替代品、友好一致的命令行接口。若你在 bat 与其他工具(lessmostdeltarg 生态等)之间做取舍,仓库提供了专门的对比文档:doc/alternatives.md

bat 以 MIT 与 Apache License 2.0 双许可分发,详见 LICENSE-MITLICENSE-APACHE

登录后查看全文
热门项目推荐
相关项目推荐