说实话,做运维这么久,我最怕的不是服务器宕机,而是看到新来的同事对着黑框框,一个字母一个字母地在那儿敲长命令。
每次看到这种场景,我都忍不住想上去拍拍他的肩膀:“哥们儿,Linux 的 history 和 Tab 补全 是摆设吗?”
今天咱们就聊聊这两个 Linux 里的“效率神器”。别觉得这是入门基础,很多人用了好几年,也就只会在命令行里盲打,从来没真正摸透它们的脾气。学会了,你的一天能省出两小时摸鱼;学不会,你就继续跟键盘死磕吧。
01 History:别光用来“数行数”
你想想,你平时查历史命令是怎么查的?是不是直接在终端里敲一个 history,然后看着满屏幕的编号发呆?
这哪叫用 History,这叫“看天书”。
说实话,默认的 History 配置真的太“素”了。它连个时间戳都没有。万一哪天系统出了故障,你想查“昨晚 11 点半谁改了防火墙规则”,结果你翻了几千条记录,全是不带时间的裸命令,你找谁哭去?
第一步:给记忆加上时间戳。
在你的 ~/.bashrc 里加上这句:
export HISTTIMEFORMAT="%F %T "
保存后 source 一下。再敲 history 试试?
是不是每条命令前面都带上了精确到秒的日期时间?以后甩锅(划掉)排查故障,这就是铁证。
第二步:给记忆扩容。
默认系统可能只记 1000 条命令。对于咱们这种一天敲几百个命令的人来说,两天前的记录就没了。太短视了!
同样在 ~/.bashrc 里:
export HISTSIZE=10000
export HISTFILESIZE=20000
记满 1 万条,文件保存 2 万条。这下哪怕你半个月前的骚操作,都能翻出来。
第三步:搜索神器 Ctrl+R。
别再用方向键 ↑ ↓ 一条条翻了!手指都要戳抽筋了。
按下 Ctrl + R,这时候终端会显示 (reverse-i-search)。
随便输几个关键字,比如 "docker" 或者 "iptables"。系统会自动从后往前匹配你输过的命令。如果不对,再按一次 Ctrl + R 继续往前找。
找到想要的命令后,回车直接执行。或者按方向键 → 进入编辑模式改几个参数再跑。
这才是正常人类该有的操作速度。
第四步:多终端同步神器 PROMPT_COMMAND。
你是不是经常开着五六个 SSH 窗口?默认的 History 有个大坑:只有关闭终端那一瞬间,才会把内存里的记录写进文件。
结果就是,你在窗口 A 敲了一堆命令,窗口 B 根本看不见。万一窗口 A 崩了,刚才的命令全丢了。
加上这句配置,每敲完一条命令,立刻追加写入文件:
export PROMPT_COMMAND="history -a; $PROMPT_COMMAND"
现在,你开十个窗口,历史记录也是实时共享的。再也不怕手滑关了终端找不回命令了。
02 Bash-completion:Tab 键的正确打开方式
很多人觉得 Tab 键就是用来补全文件名的。如果你也这么想,那真是太委屈这个键了。
你以为的 Tab:cat 123.txt
实际上的 Tab:
• 补全命令参数
输入 systemctl rest 然后按 Tab,它会自动补全成 restart、status 等等。
• 补全包名
想装个软件但记不全名字?输入 yum install ngin 按两下 Tab,所有以 nginx 开头的包名都会列出来。不用去搜索引擎查,直接问系统。
• Docker 补全(重点表扬)
这个我必须单拎出来说。玩过 Docker 的都知道,那一长串容器 ID 敲起来多痛苦。
装好 bash-completion 后,你输入 docker exec -it 然后按 Tab。
它会自动列出当前所有运行的容器名字!你连容器 ID 都不用看,直接补全容器名。
这功能,谁用谁知道,用了就回不去。
怎么装?
其实 CentOS/Ubuntu 现在基本都自带了。如果没有:
yum install bash-completion
apt install bash-completion
装完之后,记得退出终端重新登录,或者 source /etc/profile.d/bash_completion.sh。不重新加载是不生效的,别装完了喊“怎么没用”。
它的原理是啥?
说白了,就是 Bash 在后台挂载了一堆脚本。你去 /etc/bash_completion.d/ 目录下看看,里面全是各种服务的补全脚本。
Git, Docker, Kubectl, Systemd... 都在这里面。你敲 Tab 的时候,Bash 就在读这些文件,帮你猜你想输什么。
03 进阶:自己写补全脚本
你要是嫌系统自带的补全不够用,比如你自己写了个运维脚本 ops_tool.sh,想让它也能按 Tab 补全参数。
很简单,写个函数:
_ops_tool() {
local cur="${COMP_WORDS[COMP_CWORD]}"
COMPREPLY=( $(compgen -W "start stop restart status" -- $cur) )
}
complete -F _ops_tool ops_tool.sh
把这个扔进 ~/.bashrc 里。以后你敲 ops_tool.sh 然后按 Tab,它只会提示 start, stop, restart, status 这四个参数。
逼格瞬间拉满,同事看了都得以为你在写什么高级框架。
总结:别懒,工具就是用来偷懒的
Linux 为什么受我们喜欢?就是因为它从不教条,你能把它调教得多么顺手,它就能回报你多少效率。
History 和 Tab 补全,就是最基础的“调教”。
• HISTTIMEFORMAT 让你知道谁在什么时间干了坏事。
• Ctrl+R 让你从几千条命令里一秒定位目标。
• bash-completion 让你敲命令的速度跟上脑子的速度。
把这些加上,可能每天也就省个十几分钟。但一年下来,那就是好几天的摸鱼时间啊!别跟效率过不去。
赶紧去改配置吧,改完了回来点个赞。