当前位置: 首页 > 文档资料 > 优质文章推荐 v1 >

教你自定义 bash 的命令补全

优质
小牛编辑
127浏览
2023-12-01

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安装目录修改

自定义补全参数

比如我希望在输入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