现代 CLI 工具不是为了追新,而是为了解决真实工程环境里的规模问题:代码库更大、JSON 更多、远程会话更长、历史命令更复杂。它们不是替代 Unix 思想,而是在保持可组合性的前提下,给搜索、查看、选择和复用提供更好的默认值。
1. 为什么要用现代 CLI 工具
经典 Unix 工具(grep、find、cat、diff)诞生于 1970 年代。那个年代没有 Git、没有 JSON API、没有百万行代码库。今天的世界完全不同——一个中等规模的代码库可能有几十万个文件,API 返回的是嵌套 JSON,.gitignore 里有上百条忽略规则。
现代 CLI 工具的设计原则有三条:
- 更快:用 Rust 或 Go 重写,利用多核并行,速度提升 10-100 倍
- 更友好:彩色输出、智能默认值、人类可读的错误信息
- 更智能:自动尊重
.gitignore、模糊匹配、学习你的使用习惯
常见工具可以通过包管理器安装:
# macOS
brew install ripgrep fd fzf jq bat delta zoxide tmux
# Ubuntu/Debian
sudo apt install ripgrep fd-find fzf jq bat delta zoxide tmux兼容性:现代工具是经典工具的超集。rg 接受大部分 grep 参数,fd 接受大部分 find 参数。你不需要重新学习,只需要知道”更好的默认值”是什么。
2. ripgrep (rg) — 代码搜索
ripgrep(简称 rg)是 grep 的现代替代品,用 Rust 实现。核心优势是快——在大型代码库中搜索,通常比 grep -r 快 10 到 100 倍。
为什么快?第一,Rust 的零成本抽象和 SIMD 指令优化;第二,rg 默认尊重 .gitignore,自动跳过 node_modules、.git 等目录。
# 搜索(自动递归)
$ rg handleError
# 只列出文件名
$ rg -l "TODO"
# 显示匹配行及上下各 3 行
$ rg -C 3 "panic!"
# 按文件类型搜索
$ rg -t js "function"grep → rg 语法映射
| grep 写法 | rg 写法 | 说明 |
|---|---|---|
grep -r pattern . | rg pattern | rg 默认递归 |
grep -rn pattern . | rg pattern | rg 默认显示行号 |
grep -l pattern | rg -l pattern | 只列文件名 |
grep -C 3 pattern | rg -C 3 pattern | 上下文 |
grep --include='*.js' | rg -t js | 按类型过滤 |
grep -i pattern | rg -i pattern | 忽略大小写 |
grep -v pattern | rg -v pattern | 反向匹配 |
实际场景:搜索函数定义用 rg "fn handleRequest|def handleRequest";找 TODO 用 rg -C 2 "TODO|FIXME";排查日志用 rg -i "error" /var/log/app.log。
3. fd — 文件查找
fd 是 find 的现代替代品,用 Rust 实现。语法更简洁,输出带颜色,默认尊重 .gitignore。
# 搜索名称包含 "config" 的文件
$ fd config
# 只找特定扩展名
$ fd -e md
# 按类型过滤
$ fd -t f "Cargo.toml"
# 对每个结果执行命令
$ fd -e py -x wc -lfind → fd 语法映射
| find 写法 | fd 写法 | 说明 |
|---|---|---|
find . -name "*.md" | fd -e md | 按扩展名更简洁 |
find . -name "config*" | fd config | fd 默认模糊匹配 |
find . -type f | fd -t f | 语法一致 |
find . -maxdepth 2 | fd --max-depth 2 | 语法一致 |
find . -exec cmd {} \; | fd -x cmd | -x 更简洁 |
find . -iname "TEST" | fd -i test | fd 默认忽略大小写 |
实际场景:找所有 YAML 配置用 fd -e yaml -e yml;对 Python 文件统计行数用 fd -e py -x wc -l。
4. fzf — 模糊搜索
fzf 是一个通用的模糊搜索(fuzzy matching)工具。你不需要精确输入,只需要输入几个关键字符,它就能智能匹配。
三种集成模式
命令行管道:
# fd + fzf:找文件并交互式选择
$ fd | fzf
# 带预览窗口
$ fd | fzf --preview "bat --color=always {}" --preview-window right:50%
# 多选(Tab 选择多个)
$ fd | fzf -mCtrl+R 历史命令搜索:安装 fzf 后,按 Ctrl+R 交互式搜索历史命令。
Ctrl+T 文件选择:按 Ctrl+T 交互式选择文件路径并插入命令行。
与其他工具组合
# rg + fzf:搜索内容并选择文件
$ rg -l "" | fzf --preview "bat --color=always {}"
# 选择 Git 分支并切换
$ git branch | fzf | xargs git checkout实际场景:一周前执行过一条复杂的 docker run 命令,记不全了。按 Ctrl+R 输入 docker,fzf 会模糊匹配帮你快速定位。
5. jq — JSON 处理
现代开发中,API 返回的数据几乎都是 JSON。用 grep 和 awk 处理 JSON 是反模式。jq 是命令行下的 JSON 瑞士军刀,它有自己的小语言来操作 JSON 数据。
# 提取字段
$ curl -s https://api.github.com/repos/rust-lang/rust | jq '.name'
# 遍历数组(.[] 展开数组元素)
$ curl -s https://api.github.com/repos/rust-lang/rust/tags | jq '.[].name'
# 过滤:select() 筛选条件
$ curl -s https://api.github.com/repos/rust-lang/rust/issues \
| jq '.[] | select(.state == "open") | .title'学习建议
jq 的功能很强大,但你只需要掌握三个操作就能覆盖 80% 的场景:
.key— 提取字段.[]— 遍历数组select()— 条件过滤
其他操作(map、sort_by、group_by)在需要时再查文档即可。
6. bat — 代码查看
bat 是 cat 的现代替代品。它提供语法高亮、行号显示、Git 集成和不可打印字符可视化。
# 查看文件(自动语法高亮 + 行号)
$ bat src/main.rs
# 显示不可打印字符
$ bat -A config.yaml实际场景:查看代码文件时,语法高亮和行号让结构一目了然。
注意:在脚本中需要原始输出时,仍然使用 cat。bat 的语法高亮和行号会污染输出,不适合管道传递。
7. delta — Git diff 美化
Git 默认的 diff 输出是纯文本,没有语法高亮,没有行级对比。delta 为 Git diff 添加了语法高亮、行级对比和侧边栏显示。
.gitconfig 配置
[core]
pager = delta
[delta]
navigate = true
line-numbers = true
side-by-side = true
[merge]
conflictstyle = diff3配置后,所有 git diff、git show、git log -p 都会自动使用 delta 渲染。navigate 选项让你按 n / N 在变更块之间跳转,side-by-side 提供左右对比视图。
8. zoxide — 智能目录跳转
zoxide 是 cd 的智能替代品。它使用 frecency 算法(frequency + recency,频率加新近度)学习你的跳转习惯,让你用关键词直接跳转到常用目录。
# 初始化(在 shell 配置中添加)
eval "$(zoxide init bash)" # bash
eval "$(zoxide init zsh)" # zsh
# 跳转到包含关键词的目录
$ z project
# 交互式选择
$ zi实际场景:你在 ~/work/backend、~/work/frontend、~/personal/blog 之间来回切换。用 zoxide 后,只需 z back、z front、z blog。
9. tmux — 终端复用
tmux 是一个终端复用器(terminal multiplexer)。它让你在一个终端窗口中管理多个会话、窗口和面板,核心能力是会话持久化和多任务并行。
为什么需要 tmux
- 会话保持:SSH 断开后,tmux 会话仍在后台运行,进程不丢失
- 分屏:同时查看日志、运行服务和写代码,不需要开多个终端窗口
- 远程开发:在服务器上启动 tmux,断开 SSH 后任务继续运行,随时恢复
核心概念
tmux 的层级结构是三层:Session(会话)→ Window(窗口,类似浏览器标签页)→ Pane(面板,窗口内的分屏区域)。
Prefix 键:所有 tmux 快捷键都需要先按 prefix 键(本机配置为 Ctrl+A),再按功能键。
会话管理工作流
tmux new -s dev # 创建名为 "dev" 的新会话
tmux ls # 列出所有会话
tmux attach -t dev # 附加到已有会话
tmux kill-session -t dev # 关闭指定会话
# Ctrl+A d # 在 tmux 内分离会话(会话继续运行)
# Ctrl+A s # 交互式选择会话(树状视图)
# Ctrl+A $ # 重命名当前会话窗口和面板操作
# 窗口管理(Prefix = Ctrl+A)
# Ctrl+A c # 新建窗口(在当前目录)
# Ctrl+A , # 重命名当前窗口
# Ctrl+A w # 交互式选择窗口
# Ctrl+A n / p # 下一个 / 上一个窗口
# 面板管理
# Ctrl+A | # 垂直分割(左右)
# Ctrl+A - # 水平分割(上下)
# Ctrl+A 方向键 # 切换到对应面板
# Ctrl+A m # 最大化/恢复当前面板
# Ctrl+A x # 关闭当前面板(有确认)
# 其他
# Ctrl+A [ # 进入复制模式(v 开始选择,Enter 复制)
# Ctrl+A r # 重新加载配置文件典型开发环境布局
一个 session 对应一个项目,window 按职责划分:editor(写代码)、runner(运行服务/测试)、terminal(git 操作)。也可以在一个 window 内分多个 pane 同时监控日志和命令行。
SSH 远程工作场景
ssh server
tmux new -s deploy # 创建会话,运行长时间任务
# 网络断开也没关系...
ssh server
tmux attach -t deploy # 恢复,一切还在运行会话持久化(tmux-continuum)
安装 tmux-continuum 插件后,tmux 每 15 分钟自动保存所有 session 的布局和运行状态。重启机器后执行 Prefix + Ctrl+R 即可完整恢复工作现场。
9b. zellij — 现代终端复用器
zellij 是 tmux 的现代替代品,用 Rust 编写。它解决了 tmux 最大的痛点——不需要死记快捷键。
模式系统
zellij 的核心设计是模式系统。不同模式下同一个键做不同事,状态栏实时显示当前模式和可用操作:
- Normal 模式:默认模式,正常输入
- Tmux 模式:按
Ctrl+A进入,执行操作后自动回到 Normal - 状态栏底部实时提示当前可用的快捷键,不用记忆
声明式布局(KDL 格式)
zellij 用 KDL 文件描述 tab 和 pane 的排列,可以像代码一样版本管理。可以为不同项目类型维护预设布局(dev、ops、zen),一键加载。
tmux vs zellij 对比
| zellij | tmux | |
|---|---|---|
| 学习曲线 | 低(状态栏实时提示) | 中(需要记忆快捷键) |
| 布局系统 | 强(KDL 声明式) | 弱(手动分割) |
| SSH 远程 | 一般 | 成熟稳定 |
| 会话持久化 | 基础 | 强(resurrect + continuum) |
| 插件生态 | 新兴 | 成熟丰富 |
推荐
本地开发用 zellij(UI 友好、布局灵活),远程 SSH 用 tmux(生态成熟、持久化可靠)。两者可以共存,各取所长。
10. 工具速查对照表
| 经典工具 | 现代替代 | 核心优势 | macOS 安装 | Linux 安装 |
|---|---|---|---|---|
grep | ripgrep (rg) | 10-100x 更快,.gitignore 感知 | brew install ripgrep | apt install ripgrep |
find | fd | 语法简洁,彩色输出 | brew install fd | apt install fd-find |
cat | bat | 语法高亮,行号,Git 集成 | brew install bat | apt install bat |
cd | zoxide (z) | frecency 算法,关键词跳转 | brew install zoxide | apt install zoxide |
diff | delta | 语法高亮,行级对比,侧边栏 | brew install delta | apt install delta |
| — | fzf | 模糊搜索,交互式过滤 | brew install fzf | apt install fzf |
| — | jq | JSON 路径表达式,管道友好 | brew install jq | apt install jq |
| — | tmux | 终端复用,会话保持,分屏 | brew install tmux | apt install tmux |
fzf、jq、tmux在经典工具中没有直接对应物,它们填补了经典 Unix 工具集的空白。
11. 使用原则
现代工具越多,越要知道哪些适合交互,哪些适合脚本。
脚本里优先稳定输出:bat、delta、彩色输出适合人看;脚本管道里要用 cat、git diff --no-ext-diff、--json 或明确关闭颜色。
尊重项目忽略规则:rg、fd 默认尊重 .gitignore,这通常是好事;排查“为什么搜不到”时要记得检查忽略规则。
交互选择不等于自动化:fzf 很适合人工筛选,CI 和 Agent 需要非交互入口。
终端复用服务远程工作:tmux/zellij 的价值不只是分屏,而是让长任务、日志、编辑和 SSH 会话有可恢复结构。
工具进入 dotfiles 后才算资产:alias、初始化脚本、delta 配置、zoxide/fzf/tmux 配置都应该能迁移,否则只是当前机器上的手感。