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

使用空格完成bash选项卡

发布时间:2020-12-15 22:43:03 所属栏目:安全 来源:网络整理
导读:当可能的选项可能包含空格时,我遇到了bash-completion的问题. 假设我想要一个与第一个参数相呼应的函数: function test1() { echo $1} 我生成一个可能的完成选项列表(一些有空格,一些没有),但我无法正确处理空格. function pink() { # my real-world exampl
当可能的选项可能包含空格时,我遇到了bash-completion的问题.

假设我想要一个与第一个参数相呼应的函数:

function test1() {
        echo $1
}

我生成一个可能的完成选项列表(一些有空格,一些没有),但我无法正确处理空格.

function pink() {
    # my real-world example generates a similar string using awk and other commands
    echo "nick mason syd-barrett david_gilmour roger waters richard wright"
}

function _test() {
    cur=${COMP_WORDS[COMP_CWORD]}
    use=`pink`
    COMPREPLY=( $( compgen -W "$use" -- $cur ) )
}
complete -o filenames -F _test test

当我尝试这个时,我得到:

$test <tab><tab>
david_gilmour  nick           roger          waters
mason          richard        syd-barrett    wright
$test r<tab><tab>
richard  roger    waters   wright

这显然不是我的意思.

如果我没有为COMPREPLY分配一个数组,即只有$(compgen -W“$use” – $cur),如果只剩下一个选项,我就可以使用它:

$test n<tab>
$test nick mason <cursor>

但如果仍有几个选项,它们都用单引号打印:

$test r<tab><tab>
$test 'roger waters
richard wright' <cursor>

我的COMPREPLY变量肯定有问题,但我无法弄清楚是什么……

(在solaris上运行bash,以防万一…)

解决方法

如果需要处理字符串中的数据,可以使用Bash的内置字符串替换运算符.

function _test() {
    local iter use cur
    cur=${COMP_WORDS[COMP_CWORD]}
    use="nick mason syd-barrett david_gilmour roger waters richard wright"
    # swap out escaped spaces temporarily
    use="${use// /___}"
    # split on all spaces
    for iter in $use; do
        # only reply with completions
        if [[ $iter =~ ^$cur ]]; then
            # swap back our escaped spaces
            COMPREPLY+=( "${iter//___/ }" )
        fi
    done
}

(编辑:李大同)

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

    推荐文章
      热点阅读