最近写了一个命令,想使用liunx自带的自动补全来执行这个命令
首先把我写的命令做个软连接到/usr/bin 下面
[root@localhost bin]# ls -lrt|grep deployadmin
lrwxrwxrwx 1 root root 44 Apr 22 11:02 deployadmin -> /application/serveradmin/sbin/deployadmin.py
这样我输入dep(TAB)就有我的命令啦~
[root@localhost bin]# dep
deployadmin depmod
最终我要实现的结果如下:
[root@localhost ~]# deployadmin -
-a --action -h --help -i --instance -s --system
所有自动补全的命令都在/etc/bash_completion.d 这个目录下面
[root@localhost bash_completion.d]# ls -lrt
total 148
-rw-r--r--. 1 root root 4458 Aug 3 2017 createrepo
lrwxrwxrwx. 1 root root 10 Oct 3 2017 genpkgmetadata.py -> createrepo
lrwxrwxrwx. 1 root root 10 Oct 3 2017 mergerepo.py -> createrepo
那么我们也要写一个命令放在这个目录下面。我写的比较简单。(里面使用了LIUNX自带的complete,这个如果需要了解的话,可以自己百度一下……因为我还没研究这个东西,所以就不去介绍了)
#bash completion for deployadmin
_deployadmin() #主函数
{
……
}
complete -F _deployadmin deployadmin
那么如果想要实现上面的结果,要多deployadmin主函数进行补全
下面这一段是主函数
_deployadmin()
{
local cur prev opts ##
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}" ##当前光标下的单词
prev="${COMP_WORDS[COMP_CWORD-1]}" ##当前光标下的上一个单词
opts="-h --help -s --system -a --action -i --instance"
case "${cur}" in
*)
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
;;
esac
case "${prev}" in ##根据光标下的上一个单词选择不同的函数
-s|--system)
_systemname
return 0
;;
-a|--action)
_action
return 0
;;
-i|--instance)
_instancename
return 0
;;
-h|--help)
_help
return 0
;;
esac
return 0
}
再接着补充上面那些副函数
COMP_SNFILE这里面的信息需要按照空格或者换行符展示出来。
比如我这里COMP_SNFILE=$(find /same/name ‘*.conf’| sed -e ‘s/.conf//g’) .这条命令我出来的结果如下
[root@localhost bash_completion.d]# find /same/name '*.conf'| sed -e 's/.conf//g'
ng
nginx11
_systemname()
{
COMP_SNFILE=$(find /same/name '*.conf'| sed -e 's/.conf//g')
COMPREPLY=($(compgen -W "${COMP_SNFILE}" ${COMP_WORDS[${COMP_CWORD}]}))
}
根据上面的systemname的子函数,当我输入deployadmin -s (TAB建)之后就能获取到COMP_SNFILE里面的信息啦~
[root@wj-cloudsise-dev1 bash_completion.d]# deployadmin -s ng
ng nginx11
剩下的副函数如下:
_action()
{
COMP_ACFILE=$(grep -a 'action =' /same/${COMP_WORDS[2]}.conf | sed -e 's/action = //g' | sed -e 's#,# #g')
COMPREPLY=($(compgen -W "${COMP_ACFILE}" ${COMP_WORDS[${COMP_CWORD}]}))
}
_instancename()
{
COMP_INFILE=$(grep -a 'hostname =' /same/${COMP_WORDS[2]}.conf | awk -F '.' '{print $1}')
COMPREPLY=($(compgen -W "${COMP_INFILE}" ${COMP_WORDS[${COMP_CWORD}]}))
}
全部写完之后要重新加载一下bash_completion,然后才能输出最新的结果
加载的命令
source /usr/share/bash-completion/bash_completion
最后输出的结果如下:
[root@wj-cloudsise-dev1 bash_completion.d]# deployadmin -s (TAB)这里会补全_systemname函数里面的COMP_SNFILE里面的内容 -i (TAB)这里会补全_action函数里里面的COMP_ACFILE里面的内容 -a (TAB)这里会补全_instancename函数里面的COMP_INFILE里面的内容