必备工具
如今很多人已经离不开命令行,许多命令是每天必用多用的,比如超级经典的 ls 和 cd。今天我们来总结一些有意思的 CLI 工具。
更好的实现
近年来,这些经典命令的替代品开始出现,大家开始尝试使用现代且更加安全的语言(更多的是 Rust),重新实现这些经典命令。
ripgrep — grep 的替代品
ripgrep 是一款超快的递归文本搜索工具,默认遵循 .gitignore 规则,自动跳过二进制文件,并支持正则、多线程和彩色输出,是代码搜索场景下最受欢迎的 grep 替代品。
Github: BurntSushi/ripgrep
fd — find 的替代品
fd 是一个速度快、语法直观的文件搜索工具,默认尊重 .gitignore 并使用智能大小写,能够通过简单模式快速查找文件,是传统 find 命令的现代化替代品。
Github: sharkdp/fd
bat — cat 的替代品
bat 是一个带语法高亮、行号显示、Git 修改标记和自动分页的 cat 克隆,支持数百种语言,让查看文件内容变得更加美观和方便。
Github: sharkdp/bat
eza — ls 的现代替代品
eza 是一个用 Rust 编写的现代 ls 替代工具,支持彩色输出、文件图标、Git 状态标记、树状视图和超链接等特性,比传统的 ls 更美观、更强大。相比 exa,eza 更新更频繁,对新功能支持更好。
Github: eza-community/eza
tealdeer — man 的现代替代品
tealdeer 是一个快速且符合社区规范的 tldr 页面客户端,提供简洁、带示例的命令速查手册,加载速度极快,是内置 tldr 或 man 页面的高效替代品。
Github: dbrgn/tealdeer
hexyl — hexdump 替代品
hexyl 是一个色彩丰富、高度可定制的十六进制查看器,用 Rust 编写,支持不同字节分组、面板对比和彩色输出,是传统 hexdump 或 xxd 的现代化替代品。
Github: sharkdp/hexyl
zoxide — cd 替代品
zoxide 是一个更智能的目录跳转工具,通过记住你最常访问的目录来自动补全路径,支持模糊匹配和多种 Shell 集成,比传统的 cd 命令快得多。
我不喜欢 zoxide。
Github: ajeetdsouza/zoxide
delta — diff 增强工具
delta 是一个带语法高亮、行号和 Git 风格的 diff 查看器,支持并排视图、行内差异高亮和主题定制,让代码对比更加直观可读。
Github: dandavison/delta
dust — du 替代品
dust 是一个更直观的磁盘使用分析工具,用树状结构和彩色条形图展示每个目录所占空间,比传统的 du 命令更容易理解存储占用情况。
Github: bootandy/dust
procs — ps 替代品
procs 是一个用 Rust 编写的现代进程查看器,默认输出带彩色高亮、树状层级和可配置列,比传统 ps 更易读、更人性化。
Github: dalance/procs
sd — sed 替代品
sd 是一个直观的查找替换工具,语法比 sed 更简单自然,支持正则替换、大小写敏感控制和预览模式,大大降低了文本替换的学习成本。
Github: chmln/sd
choose — cut / awk 字段提取替代品
choose 是一个简洁快速的字段提取工具,使用类似 Python 的切片语法按字段或字符范围切分文本,比 cut 和 awk 更直观易记。
Github: theryangeary/choose
xh — httpie / curl 简化替代品
xh 是一个以性能为导向的 HTTP 请求发送工具,语法简洁直观,支持 JSON 美化输出、会话持久化和 HTTP/2,是交互式调试 API 的利器。
Github: ducaale/xh
优秀的程序
除了使用 Rust 等编写的替代品,还有这些推荐的优秀程序,他们弥补了默认命令的诸多空白:
fzf — 通用命令行模糊查找器
fzf 是一个交互式 Unix 过滤器,可对任何列表进行模糊匹配并实时预览,常被用作文件搜索、历史命令、进程查找等场景的交互式选择器,极大提升命令行操作效率。
Github: junegunn/fzf 使用 Golang
fend — 命令行计算器
fend 是一个任意精度的单位感知计算器,支持货币转换、单位运算、数字进制切换和变量赋值,适合在终端中快速完成数值和单位换算。
Github: printfn/fend
yazi — 终端文件管理器
yazi 是一个异步、高性能的终端文件管理器,支持图片预览、代码高亮、多标签页和插件系统,用 Rust 编写,速度极快且功能强大,是 ranger 的现代替代品。
Github: sxyazi/yazi
gum — 交互式 Shell 脚本美化工具
gum 是 Charmbracelet 生态下的工具集,用 Go 编写,让你在 Shell 脚本中轻松添加模糊选择、输入框、确认对话框、进度条等交互式界面,告别枯燥的纯文本交互。
Github: charmbracelet/gum
glow — 终端 Markdown 阅读器
glow 是 Charmbracelet 出品的终端 Markdown 渲染器,用 Go 编写,支持主题切换、自动分页和从本地或远程读取,让在终端中阅读文档变成一种享受。
Github: charmbracelet/glow
atuin — 同步式 Shell 历史
atuin 是一个用 Rust 编写的 Shell 历史记录工具,支持全历史加密云同步、统计分析和模糊搜索,让多设备间的命令历史无缝共享。
Github: atuinsh/atuin
navi
navi 是一个用 Rust 编写的交互式速查表工具,允许你通过模糊搜索浏览和执行代码片段,适合管理复杂的命令模板和速查手册。
Github: denisidoro/navi
lz
自荐一下我用 Golang 编写的快速 CLI 工具,集成了多种编码和转换操作,实现了 All-in-One 工具集。
Git: lz/lz
# 使用 go 一键编译安装
go install git.6l.ink/lz/lz@latest
更多的 CLI 工具可以参考 liuzhen932’s list
CLI/TUI Tool
Shell 小技巧
在阅读下面的部分前,强烈建议您打开一个 Shell 亲自体验。这些技巧在 bash 和 zsh 下大多通用,熟练后能明显提升命令行效率。
感叹号(Event Designators 和 Word Designators)
-
!!— 重复上一条命令sudo !! # 刚才忘敲 sudo 时的补救神器 -
!$— 上一条命令的最后一个参数mkdir -p very/deep/directory cd !$ # 直接进入刚才创建的目录除了经典的
!$获取最后一个参数,还可以用$_,按起来更快:mkdir -p very/deep/directory cd $_ # $_ 自动保存上一条命令的“最后一个参数”在
zsh里,直接按Tab可以在行内展开!$的结果,所见即所得。$_不仅等于!$,某些命令后它还是「最后的参数」但有细微差别:printf "hello\n" echo $_ # 输出 hello(不含换行符的影响) -
!^— 上一条命令的第一个参数cat file.txt another.txt less !^ # 会用 less 打开 file.txt -
!*— 上一条命令的所有参数mv *.txt /backup/ ls !* -
!:n— 上一条命令的第 n 个参数 (0 是命令本身)cp report.pdf /home/liuzhen932/docs/ mv !:1 !:2 # mv report.pdf /home/liuzhen932/docs/ -
!$:h— 最后一个参数的「目录」部分(去掉文件名)cat /var/log/nginx/access.log cd !$:h # 进入 /var/log/nginx -
!$:t— 最后一个参数的「文件名」部分wget https://example.com/file.tar.gz tar xzf !$:t -
修饰符 接在
:h:t:r:e后面:h去除路径末端(head):t仅保留文件名(tail):r去掉扩展名(root):e仅扩展名:q给替换结果加引号 → 防止空格分词:x拆分成多词:gs/old/new/全局替换
tar xzf archive.tar.gz cd !!:2:h # 进入 archive 所在目录 -
:p— 打印!!:p # 看看 !! 会展开成什么,确认无误再回车 -
^old^new— 快速替换上一条命令并执行python3 deploy.py --staging ^staging^production # 立刻执行 python3 deploy.py --production -
!!:gs/old/new— 全局替换上一条命令中所有 old 并执行docker logs -f container_name_backend !!:gs/backend/frontend # 换成查看 frontend 的日志 -
!?keyword— 执行最近一条包含 keyword 的命令!?scp # 重新执行最近一次 scp 命令 -
!-n— 倒序执行(!-1=!!)!-3 # 执行倒数第 3 条命令 -
!string— 执行最近一条以string开头的命令!pip # 重新执行最近一次 pip install ...
#
# 通常用于注释,不过,配合快捷键:Alt + # 会把当前行整体注释掉,并放入历史,这样你可以先干别的,稍后从历史里调回来继续编辑。
%
两个完全不同的角色:
-
作业控制
sleep 100 & % # 把当前作业调到前台(等同 fg) fg %2 # 调出 2 号作业 kill %1 # 杀掉 1 号作业 -
历史单词指定符
%— 最近一次!?search?匹配的那个单词docker restart container_name echo !?restart?:% # 会展开成 restart(包含搜索词的那个词)
花括号
-
花括号扩展创建备份/重命名
cp config.yml{,.bak} # 等价于 cp config.yml config.yml.bak mv file{,_old}.txt # mv file.txt file_old.txt mkdir project/{src,bin,doc}
快捷键
| 快捷键 | 作用 |
|---|---|
Ctrl + R | 反向搜索历史命令(再按一次继续往前搜) |
Ctrl + S | 正向搜索(如果被终端占用,先执行 stty -ixon) |
Alt + . 或 Esc 后按 . | 粘贴上一条命令的最后一个参数,可连续按依次上溯 |
Ctrl + A | 跳到行首 |
Ctrl + E | 跳到行尾 |
Ctrl + U | 删除光标前所有字符 |
Ctrl + K | 删除光标后所有字符 |
Ctrl + W | 删除光标前一个单词 |
Ctrl + Y | 粘贴刚才删除的内容 |
系统内置命令
-
cd -— 跳回上一个目录 搭配pushd/popd/dirs可以做目录栈管理 -
空格开头不记历史
需要设置 HISTCONTROL=ignorespace 或 HISTIGNORE 匹配
echo "这条命令不会被写进历史" -
fc— 用编辑器编辑并执行上一条命令fc # 在编辑器里修改完保存退出后立刻执行 -
disown— 让任务脱离 Shell 独立运行long_running_job & disown # 关闭终端后任务继续运行 -
date -d@1234567890— 时间截转时间 -
> name.txt— 快速创建文件
这些技巧随手用起来,终端操作会顺手很多。如您有更多推荐或本文存在问题,请留言。