bash – 如何重置COMP_WORDBREAKS而不影响其他完成脚本?

当我实现一个bash自动完成功能时,我会把它放在/etc/bash_completion.d/

为了实现某些功能,我想从变量$ COMP_WORDBREAKS中删除分词字符冒号(:),并在$ COMP_WORDBREAKS的开始添加斜杠(/)。

COMP_WORDBREAKS=" /'><=;|&("
_mytool()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    compopt -o nospace

    # my implement here

    COMPREPLY=( $(compgen ..........my_implement......... -- $cur) )
}
complete -F _mytool mytool

但是,由于该值与其他完成脚本共享,因此我无法直接重置COMP_WORDBREAKS。在完成功能调用的时候,变量COMP_WORDS数组已经被填充,所以本地更改COMP_WORDBREAKS没有任何效果

是否有任何解决方案可以在一个完成脚本中更改COMP_WORDBREAKS并且不影响其他脚本?

$ echo $BASH_VERSION
4.2.10(1)-release
修改完成脚本中的$ COMP_WORDBREAKS不是推荐的方法(因为它是一个全局变量,它可能会影响其他完成脚本的行为 – 例如ssh)。

然而,bash完成提供了一些帮助方法,您可以使用这些方法来实现您的目标。

在完成词中处理非断字字符的推荐方法是使用两种帮助方法

> _get_comp_words_by_ref与-n EXCLUDE选项

>获取单词到完成,而不考虑EXCLUDE中的字符作为单词

> __ltrim_colon_completions

>从COMPREPLY项目中删除含有前缀的冒号
(http://tiswww.case.edu/php/chet/bash/FAQ – E13的解决方法)

所以,这里是一个基本的例子,如何处理一个冒号(:)的完成词:

_mytool()
{
    local cur
    _get_comp_words_by_ref -n : cur

    # my implementation here

    COMPREPLY=( $(compgen ..........my_implement......... -- $cur) )

    __ltrim_colon_completions "$cur"
}
complete -F _mytool mytool

作为最后一个提示,帮助程序方法位于/ etc / bash_completion中。看看里面阅读每个方法的详细描述,并发现更多的帮助方法

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...