加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 如何在不影响其他完成脚本的情况下重置COMP_WORDBREAKS

发布时间:2020-12-15 19:04:51 所属栏目:安全 来源:网络整理
导读:当我实现bash自动完成功能时,有些东西让我感到困惑,我将把它放在/etc/bash_completion.d/中 为了实现某些功能,我想从变量$ COMP_WORDBREAKS中删除单词break字符冒号(:),并在$ COMP_WORDBREAKS的开头添加斜杠(/)。 COMP_WORDBREAKS=" /'=;|("_mytool(){ l
当我实现bash自动完成功能时,有些东西让我感到困惑,我将把它放在/etc/bash_completion.d/中

为了实现某些功能,我想从变量$ COMP_WORDBREAKS中删除单词break字符冒号(:),并在$ 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中。查看内部以阅读每种方法的详细说明并发现更多辅助方法。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读