写在前面
在前一阵子,我在系统上安装了elfutils软件包,然后在使用eu-readelf的过程中,发现无法支持命令参数自动补全功能,但是系统自带的readelf在输入“--”之后连续按两次<TAB>键是可以自动补全的。后来在网上找到的解决办法是在.bashrc中添加“complete -F _longopt eu-readelf”解决了这个问题,由于当时没时间想这个,就把这个问题抛之脑后了。
然后近几天,我在学习使用tmux这个终端复用神器,功能强大归强大,但美中不足的是tmux也没有命令参数自动补全功能,这让我很恼火,总不至于每次都手动慢慢输入完整的命令参数吧?于是满心欢喜的在.bashrc中添加“complete -F _longopt tmux”,奢望着这次也可以解决问题,但是结果是令人失望的,尽然毫无效果!!!
由此才意识到我对天天使用的工具思考的太少,把按<TAB>键自动补全功能认为是理所当然了,从来没想过这背后究竟发生了什么。
在了解了相关的知识后,才发现原来命令行的自动补全功能并不是程序自身的功能,而是我们天天与之打交道的shell的功能(本文限定使用的shell是bash)。bash提供有三个内置命令complete、compgen以及compopt以及几个相关的内置环境变量控制自动补全功能。因此才有了本文。
PS:关于tmux参数自动补全的功能,网上已经有大牛做好了:tmux-bash-completion
参考链接:
《我使用过的Linux命令之complete - 强劲的bash参数补全功能》
《Custom bash autocomplete script》
《linux shell中的命令自动补全(compgen complete)与 命令行参数解析》
《 【Bash百宝箱】shell命令行自动补全(compgen、complete、compopt)》
《10 Useful Linux Bash_Completion Complete Command Examples (Bash Command Line Completion on Steroids)》(Linux 中 10 个有用的命令行补全例子)
《Improving Command Line Productivity with GNU Readline》
《Accessing tab-completion programmatically in Bash》
《Bash Completion, Part 1: Using Tab Completion》
《Snippet 0x0B: Bash completion with sub-commands and dynamic options》