Liunx自动补全命令(bash_completion)

麹培
2023-12-01


最近写了一个命令,想使用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里面的内容

 类似资料: