想必大家都知道Linux的Bash的自动补全吧。在输入完部分内容后,按下Tab键,如果只有一个可能的候选内容,Bash就会帮你自动补全剩余的内容。如果有多个,那么再按一下Tab键,就会显示可用内容的列表,然后你可以继续输入,直到只剩下一种可能,再次按下Tab键即可补全。十分的方便。
我在之前的博客博客构建之路-部署中提到,我写了一个脚本用于自动化软件的发布过程,这个脚本有一个参数,为了最大限度节省人力,我希望能自动补全这个参数。
Bash的内置命令complete
和compgen
便是用于自动补全的,前者用于指定每个命令应该如何补全,而后者用于辅助你生成自动补全的候选内容。下面就来小试牛刀以下吧!
补全固定的参数列表
执行complete -W --some-arg testcmd
,然后再输入testcmd --s
,按下Tab键,自动补全就完成了,是不是非常简单呢?对于像我这个脚本这样的简单情况来说,这样也就够了。
使用函数进行更复杂的补全
当然事情并不总是这么简单,但Bash支持我们用自定义的函数来完成补全,这样的话就前途不可限量了!先来试试吧:
在Bash中输入:
function _testcmd(){
COMPREPLY=( $(compgen -W --some-arg -- $2) );
return 0;
}
complete -F _testcmd testcmd
这就可以实现和上一节相同的效果了,在函数中,$2
是当前正在补全的单词,而最后Bash将会在COMPREPLY
变量中取回可能的候选内容。另外$1
是正在补全的命令,$3
是正在补全的单词的上一个单词。具体可参见man bash
Programmable Completion部分。
compgen
还有很多功能,比如,可以很方便地补全文件名、函数名、命令名、用户名等等,具体也可参见man bash
。
自动设置补全
但是这个补全在Bash关闭后就没用了。我们当然不希望在每次打开Bash之后还要执行一次这个语句,这条语句应该被自动执行。
方便起见,我们先安装bash-completion
包,很可能你已经安装了它。
- 如果你为一个所有用户可用的命令编写补全,那么在
/etc/bash_completion.d/
中新建一个文件,将上面的用于设置自动补全的语句保存到这个文件。 - 如果你像我一样,只是为自己的脚本写个补全,那么就将语句保存到
~/.bash_completion
文件中。或者你也可以保存在你的个人文件夹中的某个文件,比如我的是~/myblog/bash_completion
,然后在~/.bash_completion
中加入一行. ~/myblog/bash_completion
。注意这行代码开头的.
,它代表在当前的Bash中执行,而不是新的进程。
正是因为上述新建的文件都将在当前的Bash中执行,所以你并不需要一般脚本中开头的#!/bin/bash
这一行。
本文部分内容参考自团子的小窝-编写Bash补全脚本