使用bash_completion进行个性化补全

线上的应用和服务器都非常多,有的应用的英文名字又很长,所以自动补全还是比较有价值的。晚上简单配置了一下。
安装好bash_completion后,在主目录下新建.bash_completion.然后写入
[bash]
# .bash_completion

_getserver() {
local APPSERVER cur
local SACONF
SACONF="/mnt/server.conf"
COMPREPLY=()
_get_comp_words_by_ref cur
if [ -f $SACONF ];then
APPSERVER=$( awk -F, ‘{app[$1]++; idc[$4]++} END{for(a in app){print a"server"; for(i in idc ){print a"server_"i}}}’ $ASACONF )
else
APPSERVER=""
fi

COMPREPLY=( $( compgen -W "$APPSERVER" — "$cur" ) )
}

_ssh() {
local APPSERVER cur
local SACONF
SACONF="/mnt/server.conf"
COMPREPLY=()
_get_comp_words_by_ref cur
if [ -f $SACONF ];then
APPSERVER=$( awk -F, ‘{server[$2]++ } END{for(a in server){print a}}’ $SACONF )
else
APPSERVER=""
fi
COMPREPLY=( $( compgen -W "$APPSERVER" — "$cur" ) )
}

#complete for getserver
complete -F _getserver getserver

#complete for ssh
complete -F _ssh ssh
[/bash]
如果需要对其他的命令补全可以类似进行扩展。其中COMPREPLY 是Bash的内置变量,一个数组,返回结果到这里去后,bash就是读取这个变量作为自动完成的匹配组合的。compgen -W “$HOST” — “$cur” 命令根据当前的输入”$cur” 返回$HOST中匹配的部分。compgen也是内置命令的。_get_comp_words_by_ref 是预定义函数,会从COMP_WORDS 和COMP_CWORD两个预定义变量中去读取当前输入信息。COMP_WORDS表示当前命令输入参数的单词数组,COMP_CWORD表示当前光标的位置

此条目发表在linux shell分类目录。将固定链接加入收藏夹。

发表回复