bat 实战:带语法高亮的现代化 cat 替代品

为什么还需要一个 cat 替代品

在 Linux 和 macOS 终端里,cat 几乎是每个开发者每天用得最多的命令之一。但 bat 实战的意义在于:它把「看文件」这件小事做到了现代开发者真正需要的样子。原生的 cat 有三道坎——没有语法高亮、没有行号、遇到二进制还会刷屏乱码。bat 在完全兼容 cat 调用方式的前提下,默认补齐了高亮、行号、Git 改动标记和分页,让你在终端里阅读代码像在编辑器里一样舒服。它基于 Rust 编写,启动快、依赖少,是现代化命令行工具箱(ripgrep、fd、zoxide)里最值得装的一员。

本文从安装、基础用法、主题配置,到与 ripgrep / fd / fzf 的组合,再到常见误区排障,带你把 bat 真正用顺手。如果你已经用过 fd 或 ripgrep,会发现 bat 和它们出自同一设计哲学。

一、安装 bat

bat 是单文件二进制,几乎每个主流包管理器都收录了它。下面按平台给出最直接的方式:

# Debian / Ubuntu
sudo apt install bat

# 注意:Debian/Ubuntu 中二进制名为 batcat,建议做软链
sudo ln -s /usr/bin/batcat /usr/local/bin/bat

# macOS (Homebrew)
brew install bat

# Windows (Scoop)
scoop install bat

# Arch Linux
sudo pacman -S bat

# Fedora
sudo dnf install bat

# 通过 Cargo(需 Rust 工具链)
cargo install bat

# 通过 Conda
conda install -c conda-forge bat

安装后执行 bat --version 验证。如果提示命令未找到,多半是 ~/.cargo/bin 或 /usr/local/bin 没有加入 PATH。

二、基础用法:像 cat 一样,但更好

bat 完全兼容 cat 的参数,所以你可以直接把肌肉记忆搬过来:

# 查看单个文件(默认带语法高亮 + 行号 + 分页)
bat script.py

# 查看多个文件
bat a.rs b.rs

# 强制显示行号 / 关闭行号
bat -n script.py      # 始终显示行号
bat -N script.py      # 始终不显示行号

# 显示 Git 工作区改动(绿色新增 / 红色删除),非常实用
bat src/main.rs

# 显示不可打印字符(等价于 cat -A)
bat -A script.sh

# 只看文件前 30 行,且不分页
bat -r :30 --paging=never script.py

其中最常用的是 Git 改动标记:在仓库里 bat 一个文件,左侧会标出相对上一次提交新增/删除的行,省去再开 git diff 的上下文切换。

三、主题与语法高亮

bat 内置多种配色主题,语法高亮由 syntect(Sublime Text 同款引擎)驱动,覆盖上百种语言。

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

# 临时指定主题
bat --theme=TwoDark script.py

# 永久生效:写入环境变量(加入 ~/.bashrc 或 ~/.zshrc)
export BAT_THEME="TwoDark"

选主题的小技巧:深色终端用 TwoDark / Visual Studio Dark+,浅色终端用 GitHub。主题名对大小写不敏感。

四、分页与翻页行为

bat 默认把输出通过 less 分页,所以长文件会自动进入翻页模式。你可以用下面参数控制:

bat --paging=never script.py     # 不进入分页(适合管道 / 脚本)
bat --paging=always script.py     # 即使内容很短也分页
bat --pager='less -R' script.py   # 自定义分页器(必须支持 -R 以保留颜色)

在管道里(如 bat file | grep xxx)bat 会自动关闭颜色和分页,因此不会影响下游命令。

五、与现代工具组合:bat 的高光时刻

bat 真正的威力,是作为「预览层」嵌进其他命令。下面是三个高频组合。

1) fd + bat:按文件名搜到后直接看内容

# 用 fd 找文件,再用 bat 预览(-X 把结果一次性喂给 bat)
fd -e rs -X bat --paging=never

2) ripgrep + bat:搜索命中处高亮预览

# rg 的 --pretty 模式本质就是 rg + bat 的拼接
rg -n --pretty 'fn main' src/

# 等价手动组合:搜到后只看命中行上下文
rg -n 'TODO' | bat -n --paging=never

3) fzf + bat:交互式文件预览

# 在 fzf 中预览选中文件(把 fzf 的预览窗口交给 bat)
export FZF_CTRL_T_OPTS="--preview 'bat --color=always --style=numbers --line-range :500 {}'"

# 配合 fd 做源
export FZF_DEFAULT_COMMAND='fd --type f --hidden --follow --exclude .git'
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"

把上面三行写进 ~/.bashrc 或 ~/.zshrc,按 Ctrl-T 就能在模糊搜索文件的同时看到高亮预览,体验接近 IDE 的文件树。顺带一提,复杂点的脚本我习惯在 VS Code 里先写好再贴进终端。

六、配置文件与别名

bat 的配置存放在 ~/.config/bat/config(Windows 在 %APPDATA%\bat\config)。你可以把常用参数固化进去,也可以用 --config-file 查看其路径:

# 查看配置文件位置
bat --config-file

# 配置文件示例(每行一个参数)
--theme="TwoDark"
--style="numbers,changes,header"
--pager="less -FR"

很多人会把 cat 别名成 bat 来全局替换:

# 在 ~/.bashrc / ~/.zshrc 中
alias cat='bat'

但要注意:某些脚本依赖原始 cat 的纯文本输出(例如 cat file | ssh ...)。稳妥做法是保留真 cat 为 \cat,只把交互场景的 cat 替换掉,避免脚本踩坑。

七、文件类型识别与自定义映射

bat 靠文件扩展名和 Shebang 判断语言。遇到无扩展名或特殊扩展名时,可以手动指定:

# 强制按某种语言高亮
bat --file-name=foo.py some_unknown_file

# 自定义扩展名 → 语言映射(写进 config 文件)
--map-syntax '.conf:ini'
--map-syntax 'Dockerfile.*:Dockerfile'
--map-syntax '*.txt:Markdown'

这对看 Nginx、系统服务的 conf 文件特别有用,一行映射就能让原本灰白的配置亮起来。

八、性能与原理

bat 基于 Rust + syntect,语法高亮是把 .sublime-syntax 规则编译成状态机后按需着色,单文件启动通常在几十毫秒内完成,不会像某些编辑器插件那样卡顿。处理超大文件时,bat 会自动降级:超过一定行数只高亮可见区域,避免一次性吃掉内存。如果你要在 CI 里批量打印日志,建议加 --paging=never 并配合 GitHub Actions 的日志查看。

九、常见误区与排障

下面是实际用 bat 时最容易踩的坑:

现象原因解决办法
执行 bat 提示 command not found未加入 PATH(常见于 Cargo 安装)把 ~/.cargo/bin 加入 PATH,或 which batcat 后做软链
颜色在管道里消失bat 检测到非 TTY 自动关色显式加 –color=always(仅用于 fzf 预览等需要颜色的场景)
WSL / 旧终端乱码终端不支持真彩或语言环境非 UTF-8设置 LANG=en_US.UTF-8,终端开启 True Color
cat 别名导致脚本异常脚本依赖纯文本 cat 输出交互用 alias,脚本用 \cat 或绝对路径
二进制文件刷屏误把 .png/.bin 当文本看用 bat -A 查看可见字符,或改用 xxd/hexdump

十、总结:把 bat 放进你的现代工具箱

bat 不是要取代 cat,而是把「终端读代码」这件事补到了及格线以上。它和 fd(更快的 find)、ripgrep(更快的 grep)、zoxide(更聪明的 cd)同属「现代化 Unix 工具箱」,装上之后几乎回不去。建议按这个最小组合起步:

工具替代对象一句话价值
batcat语法高亮 + 行号 + Git 改动
fdfind更友好的文件名搜索
ripgrepgrep忽略 .gitignore 的极速内容搜索
zoxidecd基于访问频率的智能跳转

把它们的别名和 fzf 预览写进 shell 配置,你的终端生产力会立刻上一个台阶。下次再读代码、看日志、查配置,不妨先敲一个 bat。

上一篇 FastAPI 实战:构建流式大模型对话 API
下一篇 Redis 核心数据结构实战:五种类型用法与选型
最新评论
Docker 网络模式详解:bridge/host 生产选型 - FSData
Docker 网络模式详解:bridge/host 生产选型 - FSData
8月20日
[…] 注意最后那条:把端口绑定到 127.0.0.1,再由宿主机上的 Nginx 反代进来,比直接 -p 80:80 暴露安全得多,也方便统一做
Vue3 + TypeScript 工程化:类型安全的前端架构 - FSData
Vue3 + TypeScript 工程化:类型安全的前端架构 - FSData
8月20日
[…] Pinia 的工程化用法,可以参考我们之前的实战文章 《Vue3 组合式 API + Pinia:状态管理从入门到实战》,那里覆盖了 Sto
2026 年最值得装的 10 个 VS Code 插件(AI/前端/后端/效率全覆盖) - FSData
2026 年最值得装的 10 个 VS Code 插件(AI/前端/后端/效率全覆盖) - FSData
8月19日
[…] 状态,点一下就能起停容器,配合我们讲过的 Docker Compose 编排 […]
Redis 缓存设计:穿透、击穿、雪崩与最佳实践 - FSData
Redis 缓存设计:穿透、击穿、雪崩与最佳实践 - FSData
8月19日
[…] 缓存三大坑的本质都是”缓存失效导致请求穿透到数据库”。记住口诀:穿透用布隆、击穿用锁、雪崩用错峰。配合合理的过期策略
GitHub Actions 实战:从零搭建 CI/CD 流水线 - FSData
GitHub Actions 实战:从零搭建 CI/CD 流水线 - FSData
8月19日
[…] Docker 镜像部署。结合我们之前写的 Docker Compose 一键编排实战,可以在 CI […]