说出来不怕丢人。前两天要写个文档,要手敲一个 journalctl 命令,我盯着屏幕愣了三秒——那串字母在我脑子里是「j-o-u-... 后面是 r 还是 k 来着」就记得最后是 ctl。
不是我不会,是用 tab 补全用得太顺了。敲 jou 按一下 tab,蹦出来了;再敲 -u 后面也可以 tab 出来。日子久了,手指比脑子快,真要裸敲反而卡壳。
自动补全这东西,用它是真香,用多了也真能把人用废。
自动补全,其实是两面
我后来盘了盘,日常靠补全活命的场景,掰开就两类。
第一类,系统命令。 用得多了,有些命令我完全敲下来已经记不得了,一般只记得前几个字母,tab 一下就出来。比如 systemctl,我就记得syst + tab + c + tab。还有些业务名也记不住——我们那一堆自研服务的名字,长的反人类,我都是敲两三个字母然后狂按 tab,看候选列表里有没有我想找的那个。
第二类,第三方软件的补全。 比如 kubectl、docker、helm 这些。这类跟系统命令不一样:它不在 bash 的默认认知里,得官方自己提供支持,再让你手动导入。bash 又不是它们肚子里的蛔虫,不可能猜出 kubectl get 后面能跟 pods 还是 deployments。
这俩的区别很要命:第一类你装好 bash-completion 基本就有;第二类你不手动导,按烂 tab 也补不出半个字母。
先说第一类:bash-completion 装好就完事
不同发行版一行命令,CentOS 和 Ubuntu 各管各的:
Bash# CentOS / RHEL yum install -y bash-completion source /etc/profile.d/bash_completion.sh # Ubuntu apt-get install bash-completion source /etc/bash_completion
装完验证一下,返回是函数就对了:
Bashtype _init_completion # _init_completion is a function
从那以后,sys<TAB> 补 systemctl,git ch<TAB> 补 checkout,ls /ho<TAB> 补 /home/——全通了。
我那些记不住的业务名,最早的办法特笨:就靠狂按 tab,从几十个候选里肉眼挑。服务少还行,一长串就真顶不住。后来才知道能用 complete 自己绑:
Bashcomplete -W "order-service user-service pay-gateway" myctl
敲 myctl 再 tab,三个业务名直接列出来,不用再跟列表较劲了。
第二类:第三方补全,得官方给你「字典」
重点在这。kubectl 这种,bash 压根不知道它有 get / describe / logs 多少子命令,所以必须工具自己生成补全脚本,你再 source 进去。KubeKey 默认是不开的,得手动来:
Bash# 个人用:写进 ~/.bashrc,每次登录自动加载 echo 'source <(kubectl completion bash)' >> ~/.bashrc # 全机用:需要 root,丢到系统补全目录 kubectl completion bash > /etc/bash_completion.d/kubectl
原理一句话:工具的子命令和参数是它自己最清楚的,所以它提供 completion bash 这个子命令把「字典」吐给你,你 import 进来,bash 才认得。
同理的还有 helm completion bash、terraform -install-autocomplete、装完 aws 之后用 complete -C 绑定。凡是正经点的 CLI,几乎都带个 completion 子命令——这是行业约定,不是 kubectl 一家。
⚠️ 两个坑我踩过:
kubectl completion bash生成的是 bash 脚本。你要是 zsh / fish,得换成kubectl completion zsh,不然 source 了也白搭。- 补全只在交互式 bash 里生效,写进 cron 脚本或者
sh里是不管的。
顺带一句,zsh 和 fish 我也都尝试用过,但真是用不习惯——这俩 shell 里 tab 的补全逻辑跟 bash 不一样,手指的肌肉记忆全乱了。所以到现在我还是死守 bash。
补全再爽,也有翻车的时候:
- 候选太多,tab 一下刷半屏,反而比自己敲慢——连按两下 tab 看列表,挑着来。
- 两个补全脚本打架:你同时 source 了不同版本的同名补全,
complete -p能查出现在绑的到底是哪套规则。 - 静默失效:
/etc/bash_completion.d/里混进了坏脚本,或者权限不对,补全会一声不响地罢工。
写在最后
我现在的状态很分裂:系统命令靠 tab 续命,第三方工具靠手动导「字典」,两边都不能少。
补全的本质不是「让你少敲字」,是「让你不用把命令的拼写存在脑子里」——脑子腾出来,去记更重要的事。至于 journalctl 怎么拼,忘了就忘了吧。
