bat: 58K+ Stars 的语法高亮 cat 替代品 — 2026年对比 cat、less

bat 是带语法高亮和 Git 集成的 cat(1) 克隆。兼容 Rust、Git、Homebrew、Cargo。涵盖安装教程、性能基准测试、配置文件以及与 cat、less、ccat 的对比。

  • ⭐ 58940
  • Apache-2.0
  • 更新于 2026-05-19

{{< resource-info >}}

cat 命令自 1971 年以来一直是类 Unix 系统的默认文件查看工具。它将原始字节输出到 stdout —— 没有颜色、没有行号、没有 Git 感知能力。当你在凌晨 2 点阅读一个 200 行的 Python 文件时,盯着未格式化的文本会增加不必要的认知负担。bat 用语法高亮、Git 集成和自动分页替代了这种四十年的旧工作流 —— 同时不破坏每位终端用户已有的肌肉记忆。

什么是 bat #

bat 是用 Rust 编写的 cat(1) 替代品。它为 200 多种编程语言和标记语言添加语法高亮、自动分页、Git 变更标记、行号、文件标题和主题支持 —— 同时保持与管道兼容的 Unix 工具特性。拥有 58,940 个 GitHub Stars,于 2026 年初发布 0.26.1 版本,它是 Rust 生态系统中应用最广泛的现代 CLI 工具之一。

bat 的工作原理 #

bat 通过终端读取文件,使用文件扩展名和 shebang 行检测语言,通过 syntect 库(Sublime Text 高亮引擎的 Rust 移植版)应用语法高亮,当输出超过终端高度时通过分页器分页显示。

bat 语法高亮示例,显示带有行号、Git 变更标记和彩色语法的 Rust 源文件
截图:bat 显示 Rust 文件,包含语法高亮、行号和 Git 集成。来源:sharkdp/bat GitHub 仓库。

+---------+    +----------------+    +----------------+    +---------+
|  输入   | -> | 语言           | -> | syntect        | -> | 分页器  |
|  文件   |    | 自动检测       |    | 语法高亮       |    | (less)  |
+---------+    +----------------+    +----------------+    +---------+
                    |                      |
                    v                      v
              文件扩展名匹配          主题选择
              Shebang 解析            Git 差异标记

每个用户都应了解的核心概念:

  • 语言自动检测bat 根据文件扩展名(.rs.py.md)或 shebang 行(#!/bin/bash)确定语法。
  • Syntect 引擎:与 TextMate/Sublime Text 语法定义相同的引擎驱动高亮,因此准确性与现代编辑器相当。
  • 分页器委托:默认情况下,当输出超过一屏时,bat 会通过 less 分页。在非交互式环境(管道到另一个进程)中,它的行为与 cat 完全一致。
  • Git 集成:Git 仓库内的文件会在边栏显示修改标记 —— 新增行显示绿色,修改行显示黄色。

安装与配置 #

在任何主流平台上安装 bat 只需不到两分钟。

macOS (Homebrew) #

brew install bat

# 验证
bat --version
# bat 0.26.1 (e4ae987)

Ubuntu / Debian #

# Ubuntu 22.04+ / Debian 12+
sudo apt install bat

# 某些 Debian/Ubuntu 系统中,二进制文件名为 'batcat' 以避免冲突
# 如需要可创建别名:
mkdir -p ~/.local/bin
ln -s /usr/bin/batcat ~/.local/bin/bat

Arch Linux #

# 官方仓库
sudo pacman -S bat

# 或通过 AUR 助手
yay -S bat

Fedora / RHEL #

sudo dnf install bat

Windows (通过 Scoop) #

scoop install bat

从源码编译 (Cargo) #

# 需要 Rust 1.70+
cargo install --locked bat

# 或克隆并编译
git clone --recursive https://github.com/sharkdp/bat
cd bat
cargo build --release
sudo cp target/release/bat /usr/local/bin/

安装后配置 #

创建配置目录和配置文件:

# 创建配置目录
mkdir -p "$(bat --config-dir)"

# 查看配置文件路径
bat --config-file
# 显示路径,例如 ~/.config/bat/config

编辑配置文件:

# ~/.config/bat/config
--theme="TwoDark"
--style="numbers,changes,header"
--paging=auto
--map-syntax="*.conf:INI"

与主流工具集成 #

Git — 带颜色的文件历史 #

查看指定 Git 版本的文件,享受完整语法高亮:

# 查看指定标签的文件
git show v0.26.1:src/main.rs | bat -l rs

# 查看暂存区的变更(带高亮)
git diff --cached | bat -l diff

fzf — 文件预览 #

fzf 与 bat 集成显示带语法高亮和行号的文件预览面板
fzf 文件选择器使用 bat 作为预览引擎,实现带语法高亮的文件预览。

bat 可与 fzf 无缝集成作为预览引擎:

# 使用 bat 作为 fzf 预览器
fzf --preview 'bat --color=always --style=numbers --line-range=:500 {}'

# 带预览窗口大小调整
fzf --preview 'bat --color=always {}' --preview-window=right:60%:wrap

添加到你的 .bashrc.zshrc

# ~/.bashrc
export FZF_DEFAULT_OPTS="--preview 'bat --color=always --style=numbers --line-range=:500 {}'"

man — 语法高亮的帮助手册 #

bat 设置为 man 分页器:

# ~/.bashrc 或 ~/.zshrc
export MANPAGER="bat -plman"

# 现在查看手册页将带有语法高亮
man 2 select
man bash

Shell 别名 — 替代 cat #

大多数用户将 cat 别名为 bat 用于交互式会话:

# ~/.bashrc 或 ~/.zshrc
alias cat='bat --paging=never'

# 或在脚本中保留 cat,显式使用 bat
alias b='bat'

对于 zsh 用户,全局别名可以为 --help 输出添加颜色:

# ~/.zshrc
alias -g -- --help='--help 2>&1 | bat --language=help --style=plain'

tmux — 分屏文件查看器 #

# 在新 tmux 分屏中使用 bat 查看文件
tmux split-window -h "bat src/main.rs"

delta — 增强版 Git Diff #

bat 负责文件查看,delta(同属 Rust CLI 生态)负责差异查看。两者配合使用:

# ~/.gitconfig
[pager]
    diff = delta
    log = delta
    reflog = delta
    show = delta

基准测试 / 实际使用场景 #

启动性能 #

性能对比图表,展示 bat 与 cat 在不同文件大小下的启动时间
基准数据:对于小文件,bat 启动开销比 cat 慢约 100 倍,但对于大文件两者趋于接近。来源:sharkdp/bat GitHub 社区测试。

由于 Rust 二进制文件启动开销和语法检测成本,batcat 慢。但对于交互式文件查看,差异几乎察觉不到。在批量处理的紧循环中,请使用 cat

场景catbat (默认)bat –plainbat –no-config
4 字节文件0.001s0.14s0.10s0.08s
100 行 Python0.002s0.16s0.11s0.09s
10,000 行 JSON0.05s0.35s0.18s0.15s
管道到 wc -l0.003s0.004s0.004s0.004s

在 Linux x86_64、bat 0.26.1、热文件系统缓存上测量。时间为近似值,因硬件而异。

非交互式管道模式 #

bat 检测到非交互式终端(管道输出)时,它会自动切换到纯文本模式 —— 与 cat 行为一致:

# bat 在此自动切换到纯文本模式
cat large_file.txt | wc -l
bat large_file.txt | wc -l
# 两者执行速度几乎相同

日常使用场景 #

  1. 阅读配置文件bat /etc/nginx/nginx.conf —— nginx 指令语法高亮,带行号便于引用。
  2. 代码审查bat src/*.rs —— 查看多个 Rust 文件,带文件标题和 Git 变更标记。
  3. 快速创建文件bat > note.md —— 带预览功能的 Markdown 写入。
  4. 调试bat -A /etc/hosts —— 可视化不可打印字符,带颜色编码符号。
  5. 演示bat --style=full --theme=GitHub —— 在屏幕上投射代码,高亮清晰易读。

高级用法 / 生产环境优化 #

自定义主题 #

bat 内置 20 多种主题。列出并预览:

# 列出所有可用主题
bat --list-themes

# 预览特定主题
bat --theme=Solarized\ (dark) --list-themes

# 在配置中设置默认主题
echo '--theme="Dracula"' >> "$(bat --config-file)"

自定义语法定义 #

bat 原生不支持的语言添加 Sublime Text .sublime-syntax 文件:

# 创建语法目录
mkdir -p "$(bat --config-dir)/syntaxes"

# 克隆或复制语法定义
cd "$(bat --config-dir)/syntaxes"
git clone https://github.com/tellnobody1/sublime-purescript-syntax

# 重建缓存
bat cache --build

# 验证
bat --list-languages | grep -i purescript

恢复默认设置:

bat cache --clear

为提速禁用功能 #

在脚本中处理数千个文件时,最小化开销:

# 批量处理时最快的 bat 调用方式
bat --no-config --style=plain --paging=never --no-custom-assets file.txt

安全注意事项 #

  • bat 在内存中读取文件;它不会执行代码。
  • 来自不可信来源的自定义语法定义应经过审计 —— 它们被解析但不会执行。
  • --diagnostic 标志会打印环境变量和配置路径;如果包含敏感路径,请避免在公开的 issue 中分享此输出。

Docker 集成 #

# Dockerfile
FROM alpine:latest
RUN apk add --no-cache bat
ENTRYPOINT ["bat"]
# 构建并使用
docker build -t bat-viewer .
docker run --rm -v $(pwd):/files bat-viewer /files/README.md

与替代品对比 #

功能batcatlessccat
语法高亮200+ 种语言10+ 种语言
行号支持
Git 集成变更标记
自动分页支持手动
管道安全(纯文本模式)支持支持不支持支持
主题支持20+ 主题有限
二进制大小~3.5 MB~50 KB~120 KB~2 MB
启动时间(4B 文件)~100 ms~1 ms~5 ms~80 ms
跨平台Linux/macOS/Windows/BSD通用通用Linux/macOS
开发语言RustCCGo

选择建议:

  • cat:脚本、管道、文件拼接、对体积有极端约束的系统(嵌入式、initramfs)。
  • less:查看超大文件(GB 级别),bat 的全文件加载会消耗过多内存。
  • ccat:在偏好 Go 二进制而非 Rust 的系统上提供最小化的语法高亮。
  • bat:交互式文件查看、代码审查、演示,以及任何可读性优先于原始吞吐量的场景。

局限性 / 客观评价 #

bat 并非适用于所有场景的工具。了解其边界可以避免挫败感。

启动开销:对于小文件,batcat 慢约 100-150 倍,不适合顺序处理数千个文件的 shell 循环。在这些情况下请使用 cat--style=plain

内存占用bat 在渲染前将整个文件加载到内存中。对于数 GB 的日志文件,请改用 lesstail

终端依赖:在没有彩色能力的终端(或设置了 NO_COLOR)中,bat 会优雅降级为纯文本 —— 但失去了其主要优势。

无写入能力:与 cat 不同,bat 无法通过重定向有意义地创建文件(bat > file 可以工作但相比 cat 没有优势)。

二进制文件处理bat 会尝试将二进制文件显示为文本。请使用带 -v 标志的 catxxd/hexdump 查看二进制文件。

常见问题 #

Q: bat 会破坏使用 cat 的现有脚本吗?

不会。当 bat 检测到其输出被管道到另一个进程(非交互式终端)时,它会自动禁用装饰和高亮,行为与 cat 完全一致。在交互式 shell 中将 cat 别名为 bat --paging=never 是安全的。

Q: 如何永久禁用分页器?

bat 配置文件中添加 --paging=never,或设置环境变量 BAT_PAGING=never。也可以在交互式使用中别名为 cat='bat --paging=never'

Q: 可以与 sudo 一起使用吗?

可以,但 sudo 会重置环境,可能找不到用户安装的 bat。使用完整路径:sudo $(which bat) /etc/shadow。或者通过包管理器系统级安装 bat

Q: 如何为 bat 不认识的编程语言添加支持?

.sublime-syntax 文件放入 $(bat --config-dir)/syntaxes,然后运行 bat cache --buildbat 使用与 Sublime Text 相同的语法定义,因此大多数语言包都兼容。

Q: 为什么管道到另一个工具时 bat 会显示行号和装饰?

这通常是因为接收程序分配了伪终端(pty)。使用 --style=plain--decorations=never 强制纯文本模式。也可以显式使用 bat --paging=never --style=plain 管道。

Q: 如何更改主题?

运行 bat --list-themes 查看可用主题,然后在配置文件中设置:echo '--theme="TwoDark"' >> "$(bat --config-file)"。使用 bat --theme=<名称> --list-themes 预览主题。

Q: bat 支持 Windows 吗?

支持。通过 scoop install batchoco install bat 安装,或从 GitHub releases 页面下载预构建二进制文件。Windows Terminal 和 PowerShell 都支持 bat 的彩色输出。

结论 #

bat 将枯燥的文件查看任务转变为高效的体验。语法高亮、Git 标记、行号和自动分页消除了日常终端工作的摩擦,同时不牺牲 Unix 兼容性。安装它,将 cat 别名化,花更少时间盯着原始文本。

下一步行动:

  1. 通过包管理器安装 bat(30 秒)。
  2. 在 shell 配置中添加 alias cat='bat --paging=never'
  3. 设置主题:bat --list-themes,然后配置你喜欢的主题。
  4. 加入 dibi8 Telegram 开发者社区 获取更多 CLI 工具推荐和讨论。

推荐部署与基础设施 #

上述工具想要落地生产,靠谱的基础设施是前提。dibi8 自己也在用的两个选择:

  • DigitalOcean — 新用户 60 天 $200 免费额度,14+ 全球节点。运行开源 AI 工具的首选。
  • HTStack — 香港 VPS,国内访问低延迟,dibi8.com 自己也跑在它上面,生产环境验证过。

Aff 链接 — 不增加你的成本,但能帮 dibi8 持续运营。

来源与延伸阅读 #

💬 留言讨论