教你自定义bash的命令补全

请尊重原创,转载请注明来源网站www.lcsays.com以及原始链接地址

complete命令介绍

 

linux和mac系统自带的complete命令非常强大,用法例如complete -F _ps ps表示当我们输入ps命令后会执行_ps这个函数来做补全,虽然强大但不容易使用,需要一些辅助工具帮我们做一些封装的工作

 

安装bash-completion

 

bash-completion是封装了complete命令的一套脚本(也为我们写好了一些常用命令的补全,但还不够)

mac系统安装方法:

brew install bash-completion

centos/rhel系统安装方法:

yum install bash-completion

其他linux系统安装方法类似

 

安装后会在/etc(brew安装的会在/usr/local/etc)下某个目录中生成bash_completion.sh文件和bash_completion.d目录,其中bash_completion.sh里面封装了一些有用的函数,需要加到.bash_profile里加载,而bash_completion.d目录则都是自定义的补全方法

 

在.bash_profile中添加

. /etc/bash_completion

具体路径随bash-completion安装目录修改

 

自定义补全参数

请尊重原创,转载请注明来源网站www.lcsays.com以及原始链接地址

比如我希望在输入ps+空格后按TAB键自动帮我补全aux,则只需要在bash_completion.d目录创建一个文件,假如命名为ps,内容如下:

_ps()
{
    COMPREPLY="aux"
    return 0
} &&
complete -F _ps ps

 

重新登录bash后执行ps+空格+TAB键,是不是自动补全成ps aux?

解释:这里的_ps是一个函数,complete -F _ps ps表示当我输入ps时会按照_ps函数来指明补全逻辑,这里的COMPREPLY就是回写补全字符串的变量

 

按提示补全

 

比如我希望在输入ps+空格+a+TAB自动补全aux,在输入ps+空格+u+TAB自动补全ux,意思就是要根据参数的前缀来确定补全哪种参数,那么内容改成如下:

_ps()
{
    local cur
    _get_comp_words_by_ref cur
    case $cur in
        a*)
        COMPREPLY="aux"
            return 0
            ;;
        u*)
        COMPREPLY="ux"
            return 0
            ;;
    esac
    return 0
} &&
complete -F _ps ps

解释:这里的_get_comp_words_by_ref是读取已经输入的前缀,判断$cur如果前缀是a,就补全aux,如果前缀是u就补全ux