Bash自动补全

创建时间:2017/3/4 下午11:28:16
编辑时间:2017/3/11 下午5:47:08
作者: huww98@163.com (huww98@163.com)
分类:Linux

想必大家都知道Linux的Bash的自动补全吧。在输入完部分内容后,按下Tab键,如果只有一个可能的候选内容,Bash就会帮你自动补全剩余的内容。如果有多个,那么再按一下Tab键,就会显示可用内容的列表,然后你可以继续输入,直到只剩下一种可能,再次按下Tab键即可补全。十分的方便。

我在之前的博客博客构建之路-部署中提到,我写了一个脚本用于自动化软件的发布过程,这个脚本有一个参数,为了最大限度节省人力,我希望能自动补全这个参数。

Bash的内置命令completecompgen便是用于自动补全的,前者用于指定每个命令应该如何补全,而后者用于辅助你生成自动补全的候选内容。下面就来小试牛刀以下吧!

补全固定的参数列表

执行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补全脚本


返回文章列表

评论

登录 / 注册 后发布评论