alias & complete(自动补全)使用例子

又写了一句: sudo apt-get install … , 忽然觉得最近老是用这个命令来安装,于是加了一句这样alias,来简化:

alias apt-install=”sudo apt-get install”

装着装着,又发现了,这样用原来与从前有些不同:少了自动补全……

原先包名每打完,可以通过tab键列出可能的报名进行选择。

于是,查找了一些资料,发现在ubuntu,bash命令行的自动补全,是使用compete & compgen命令完成。全局自动补全的内容写在:“/etc/bash_completion” 和 “/etc/bash_completion.d”下。

新建/etc/bash_completion.d/apt-install,在里面添加内容:

  1 function _apt_install(){
  2     COMPREPLY=()
  3     local cur=${COMP_WORDS[COMP_CWORD]}
  4     local com=${COMP_WORDS[COMP_CWORD-1]}
  5     COMPREPLY=($(apt-cache --no-generate pkgnames "$cur" 2> /dev/null))
  6 }
  7
  8 complete -F _apt_install apt-install

退出终端,重新登录,你就会发现apt-install命令也有自动提示啦!!!

这边没有使用到compgen,compgen主要的用途是根据命令的前缀,在某集合里寻找匹配前缀的关键字,如下:

compgen -W “abcd abc ab efg ef d” — a

会在”abcd abc ab efg ef d”中寻找a开头的关键字,并输出到控制台。

该命令通常用来生成变量COMPREPLY的内容。

complete 和 compgen似乎没有什么文档,大家可以通过“help complete”,“help compgen”,得到一些提示。

下面还有一个例子:

function _abc() {
    COMPREPLY=()
    local cur=${COMP_WORDS[COMP_CWORD]};
    local com=${COMP_WORDS[COMP_CWORD-1]};
    case $com in
    'abc')
        COMPREPLY=($(compgen -W 'build_all compile update' -- $cur))
        ;;
    'compile')
        local pro=($(awk '{print $1}' project.list))
        COMPREPLY=($(compgen -W '${pro[@]}' -- $cur))
        ;;
    *)
        ;;
    esac
    return 0
}

complete -F _abc abc

参考:

发表评论