现代 CLI 工具不是为了追新,而是为了解决真实工程环境里的规模问题:代码库更大、JSON 更多、远程会话更长、历史命令更复杂。它们不是替代 Unix 思想,而是在保持可组合性的前提下,给搜索、查看、选择和复用提供更好的默认值。

1. 为什么要用现代 CLI 工具

经典 Unix 工具(grepfindcatdiff)诞生于 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 patternrg 默认递归
grep -rn pattern .rg patternrg 默认显示行号
grep -l patternrg -l pattern只列文件名
grep -C 3 patternrg -C 3 pattern上下文
grep --include='*.js'rg -t js按类型过滤
grep -i patternrg -i pattern忽略大小写
grep -v patternrg -v pattern反向匹配

实际场景:搜索函数定义用 rg "fn handleRequest|def handleRequest";找 TODO 用 rg -C 2 "TODO|FIXME";排查日志用 rg -i "error" /var/log/app.log

3. fd — 文件查找

fdfind 的现代替代品,用 Rust 实现。语法更简洁,输出带颜色,默认尊重 .gitignore

# 搜索名称包含 "config" 的文件
$ fd config
 
# 只找特定扩展名
$ fd -e md
 
# 按类型过滤
$ fd -t f "Cargo.toml"
 
# 对每个结果执行命令
$ fd -e py -x wc -l

find → fd 语法映射

find 写法fd 写法说明
find . -name "*.md"fd -e md按扩展名更简洁
find . -name "config*"fd configfd 默认模糊匹配
find . -type ffd -t f语法一致
find . -maxdepth 2fd --max-depth 2语法一致
find . -exec cmd {} \;fd -x cmd-x 更简洁
find . -iname "TEST"fd -i testfd 默认忽略大小写

实际场景:找所有 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 -m

Ctrl+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。用 grepawk 处理 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% 的场景:

  1. .key — 提取字段
  2. .[] — 遍历数组
  3. select() — 条件过滤

其他操作(mapsort_bygroup_by)在需要时再查文档即可。

6. bat — 代码查看

batcat 的现代替代品。它提供语法高亮、行号显示、Git 集成和不可打印字符可视化。

# 查看文件(自动语法高亮 + 行号)
$ bat src/main.rs
 
# 显示不可打印字符
$ bat -A config.yaml

实际场景:查看代码文件时,语法高亮和行号让结构一目了然。

注意:在脚本中需要原始输出时,仍然使用 catbat 的语法高亮和行号会污染输出,不适合管道传递。

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 diffgit showgit log -p 都会自动使用 delta 渲染。navigate 选项让你按 n / N 在变更块之间跳转,side-by-side 提供左右对比视图。

8. zoxide — 智能目录跳转

zoxidecd 的智能替代品。它使用 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 backz frontz 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 的排列,可以像代码一样版本管理。可以为不同项目类型维护预设布局(devopszen),一键加载。

tmux vs zellij 对比

zellijtmux
学习曲线低(状态栏实时提示)中(需要记忆快捷键)
布局系统强(KDL 声明式)弱(手动分割)
SSH 远程一般成熟稳定
会话持久化基础强(resurrect + continuum)
插件生态新兴成熟丰富

推荐

本地开发用 zellij(UI 友好、布局灵活),远程 SSH 用 tmux(生态成熟、持久化可靠)。两者可以共存,各取所长。

10. 工具速查对照表

经典工具现代替代核心优势macOS 安装Linux 安装
grepripgrep (rg)10-100x 更快,.gitignore 感知brew install ripgrepapt install ripgrep
findfd语法简洁,彩色输出brew install fdapt install fd-find
catbat语法高亮,行号,Git 集成brew install batapt install bat
cdzoxide (z)frecency 算法,关键词跳转brew install zoxideapt install zoxide
diffdelta语法高亮,行级对比,侧边栏brew install deltaapt install delta
fzf模糊搜索,交互式过滤brew install fzfapt install fzf
jqJSON 路径表达式,管道友好brew install jqapt install jq
tmux终端复用,会话保持,分屏brew install tmuxapt install tmux

fzfjqtmux 在经典工具中没有直接对应物,它们填补了经典 Unix 工具集的空白。

11. 使用原则

现代工具越多,越要知道哪些适合交互,哪些适合脚本。

脚本里优先稳定输出batdelta、彩色输出适合人看;脚本管道里要用 catgit diff --no-ext-diff--json 或明确关闭颜色。

尊重项目忽略规则rgfd 默认尊重 .gitignore,这通常是好事;排查“为什么搜不到”时要记得检查忽略规则。

交互选择不等于自动化fzf 很适合人工筛选,CI 和 Agent 需要非交互入口。

终端复用服务远程工作:tmux/zellij 的价值不只是分屏,而是让长任务、日志、编辑和 SSH 会话有可恢复结构。

工具进入 dotfiles 后才算资产:alias、初始化脚本、delta 配置、zoxide/fzf/tmux 配置都应该能迁移,否则只是当前机器上的手感。

延伸阅读