为什么还需要一个 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 工具箱」,装上之后几乎回不去。建议按这个最小组合起步:
| 工具 | 替代对象 | 一句话价值 |
|---|---|---|
| bat | cat | 语法高亮 + 行号 + Git 改动 |
| fd | find | 更友好的文件名搜索 |
| ripgrep | grep | 忽略 .gitignore 的极速内容搜索 |
| zoxide | cd | 基于访问频率的智能跳转 |
把它们的别名和 fzf 预览写进 shell 配置,你的终端生产力会立刻上一个台阶。下次再读代码、看日志、查配置,不妨先敲一个 bat。




