9 月中旬那篇 zram 文章的结尾提了一嘴,说下次写写这阵子折腾的命令行工具。今天是周三,空下来就把这坑填了。主角是 fzf,一个模糊搜索工具,装完之后翻文件、翻历史命令基本不用打全名了。
装 fzf,先改一个排序
Ubuntu 24.04 上就是一行 apt install fzf,不整什么源码编译,小鸡上能省则省。
装完先改一个行为:Ctrl+R 翻历史命令默认是倒着排的,最新的在上面。我不喜欢这个排序,直接在 ~/.bashrc 里写了个函数把它整个接管了,按时间正序排,再按使用次数加权,最近在用的命令自动浮到最上面。注意写的是 bind -x,这东西只认 bash,我第一天写成 bind '"\C-r": ...' 那种带引号的老语法,按下去一点反应没有,排查了半天。
顺手给自己立了个小规矩:~/.bash_history 先备份一份再动这些配置。装 fzf 之前我也只是"大概觉得"不会有冲突,真出问题还能回滚,几秒钟的事。
翻文件、杀进程,全走模糊搜索
文件搜索是最常用的场景。我自己写了个小脚本挂在 PATH 里,核心就两行:
fd --type f | fzf --preview 'bat --color=always {}'
预览窗口配 bat,搜到哪个文件右边直接出高亮代码。装了 fzf 的 tab 补全之后,cd **、kill ** 这些双星号触发器也一起能用,翻目录跟翻牌一样。
进程清理也好用了。挑进程杀,用 ps aux | fzf 选中后按回车取 PID。小鸡内存本来就紧,以前清理进程全靠 top 里一行行看,现在一步到位。唯一要注意的是选中之后传给 kill 的是整行文本,得自己 awk 一下把 PID 抠出来,直接整行丢过去是会报错的。
Ctrl+T 也顺手开了。敲命令敲到一半要补文件路径,按一下就在当前目录模糊搜,回车直接把路径粘到光标位置。写 Hugo 文章引用图片路径的时候特别爽。
彩蛋:今天还踩了个 chattr 的坑
今天折腾的时候顺手踩了个没见过的坑,必须记一笔。
我有一台小机器上 /etc/resolv.conf 不知道被谁锁了,chattr +i 设了不可变属性。今天想改 DNS,vim 打开是只读,chmod 报 Operation not permitted,rm 也是 Permission denied。第一反应是被入侵了,后来看了眼 lsattr 才发现是那个 i 标志。
解锁的办法是 chattr -i /etc/resolv.conf,改完想防它再被覆盖就再 chattr +i 锁回去。这属性是文件系统级别的,root 来了也不好使,正常。这坑属于平时一辈子遇不上、遇上一回懵半天的那种,记下来给以后的自己。
内存代价
这套工具链(fzf + fd + eza + bat)在我这台 1.9G 的小鸡上,常驻内存大约 300M,搜索是瞬时的,没感觉到卡。当然也是 zram 先把内存腾出来了,才有得折腾。工具链再加一层 shell 集成,大概就是这么个规模,1G 内存的机器建议谨慎,2G 往上可以随便上。
这套折腾完,命令行的日常操作基本告别全键盘打路径了。挖个新坑:下次说说怎么把 Hugo 的构建部署也做成一条命令。写完这篇我就去弄。
就这样。