bash中的自动完成功能

bash的按TAB键自动补全(自动完成)的原理与扩展


reference: http://hi.baidu.com/widebright/item/5f92a4cf65c79709c710b2ac


用过bash的人,可能都对TAB自动补全功能有印象吧,按一下“TAB“键就自动帮你把命令或者文件名补全,确实好用。
这个应该是bash解析用户输入的时候,加上这个自动补全的功能的。方便的地方是bash提供的内置命令complete允许你对这个功能进行自定义扩展。 比如
complete -F _my_host my_ssh  就会指定 my_ssh这个名字的自动完成由 _my_host 这个函数去处理

比如我在 .bashrc 后面加上下面这个代码之后
----------------------------------------------
_my_host() {
    local HOST cur

    COMPREPLY=()
    _get_comp_words_by_ref cur

    HOST="local test test2 devolop"

    COMPREPLY=( $( compgen -W "$HOST" -- "$cur" ) )
}
complete -F _my_host my_ssh
alias egenera_ssh=/home/widebright/桌面/my_ssh.pl
-----------------------------------------------
这样设置之后,在终端再输入自己的自定义命令my_ssh 然后按TAB键,就会自动出来自己预先定义的host主机名字了
---------------
widebright@:~/桌面$ my_ssh
local test test2 devolop
-------------------------

其中COMPREPLY 是Bash的内置变量,一个数组,返回结果到这里去后,bash就是读取这个变量作为自动完成的匹配组合的。
compgen -W "$HOST" -- "$cur" 命令根据当前的输入"$cur" 返回$HOST中匹配的部分。compgen也是内置命令的。_get_comp_words_by_ref 是预定义函数,不过自己从COMP_WORDS 和COMP_CWORD两个预定义变量中去读取当前输入信息。COMP_WORDS表示当前命令输入参数的单词数组,COMP_CWORD表示当前光标的位置。参考一个例子

------------------------
_xm()
{
    local cur prev opts base
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"

    #
    #  The basic options we'll complete.
    #
    opts="console create list"


    #
    #  Complete the arguments to some of the basic commands.
    #
    case "${prev}" in
    console)
        local running=$(for x in `xm list --long | grep \(name | grep -v Domain-0 | awk '{ print $2 }' | tr -d \)`; do echo ${x} ; done )
        COMPREPLY=( $(compgen -W "${running}" -- ${cur}) )
            return 0
            ;;
        create)
        local names=$(for x in `ls -1 /etc/xen/*.cfg`; do echo ${x/\/etc\/xen\//} ; done )
        COMPREPLY=( $(compgen -W "${names}" -- ${cur}) )
            return 0
            ;;
        *)
        ;;
    esac

   COMPREPLY=($(compgen -W "${opts}" -- ${cur})) 
   return 0
}
complete -F _xm xm
------------------------------------

complete 命令的和预定义的详细说明可以参考bash的文档。
启动complete -p 可以查看bash已经定义的命令的自动完成函数。

现在有一个叫做“Bash Completion  http://bash-completion.alioth.debian.org/ “的包,已经定义了很多名字的自动完成的处理函数了。只要你 “. /etc/bash_completion” 一下这些就全部可以用了。不过这个应该不用自己作了,我转了ubuntu,都自动配置好了吧。不如在这个/etc/bash_completion.d这个目录下就还有很多命令的例子,比如:

/etc/bash_completion.d/apache2ctl
------------------------------------------------------
# apache2ctl(1) completion
have apache2ctl && {
_apache2ctl() {
    local APWORDS cur

    COMPREPLY=()
    _get_comp_words_by_ref cur

    APWORDS=$(apache2ctl 2>&1 >/dev/null | awk 'NR<2 { print $3; exit }' | \
        tr "|" " ")

    COMPREPLY=( $( compgen -W "$APWORDS" -- "$cur" ) )
}
complete -F _apache2ctl apache2ctl
}

# Local variables:
# mode: shell-script
# sh-basic-offset: 4
# sh-indent-comment: t
# indent-tabs-mode: nil
# End:
# ex: ts=4 sw=4 et filetype=sh
---------------------------------------------------

很多时候,自己往系统里面加了一些命令或者程序之后,自己再定义一个“自动完成”的处理给他,会方便很多的吧。

参考文章
An introduction to bash completion: part 1   http://www.debian-administration.org/articles/316
http://www.debian-administration.org/article/An_introduction_to_bash_completion_part_2
More on Using the Bash Complete Command   http://www.linuxjournal.com/content/more-using-bash-complete-command


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值