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

bash – 具有等号的完整命令选项

发布时间:2020-12-15 22:38:54 所属栏目:安全 来源:网络整理
导读:我正在尝试为命令编写一个 Bash完成脚本,该命令可以在表单–option或–param = value上使用长选项.如果用户已在命令行中输入了一个选项,则应从完成列表中排除该选项(假设在命令行上指定给定选项一次才有意义). 这是第一次尝试: _myprog(){ local cur="${COM
我正在尝试为命令编写一个 Bash完成脚本,该命令可以在表单–option或–param = value上使用长选项.如果用户已在命令行中输入了一个选项,则应从完成列表中排除该选项(假设在命令行上指定给定选项一次才有意义).

这是第一次尝试:

_myprog()
{
    local cur="${COMP_WORDS[$COMP_CWORD]}"

    local words=(--help --param1= --param-state --param2=)
    _exclude_cmd_line_opts
    COMPREPLY=( $(compgen -W "${words[*]}" -- "$cur") )
}
complete -F _myprog myprog

_exclude_cmd_line_opts() {
    local len=$(($COMP_CWORD - 1))
    local i
    for i in "${COMP_WORDS[@]:1:$len}" ; do
         [[ $i == --* ]] && words=( "${words[@]/$i}" )
    done
}

如果源脚本源脚本.sh然后写:

$myprog --param1= <tab><tab>

我得到以下完成列表:

=              --help         --param2=      --param-state

所以它几乎可以工作除了我在完成列表中得到一个虚假的’=’标志..有什么建议吗?

解决方法

在命令行中输入等号会因COMP_WORDBREAKS的默认内容而导致单词中断.效果似乎是等号在COMP_WORDS中作为单独的单词输入.这在_exclude_cmd_line_opts的以下修改中被利用:

_exclude_cmd_line_opts() {
    local len=$(($COMP_CWORD - 1))
    local i
    for ((i=1 ; i<=len; i++)) ; do
        local j="${COMP_WORDS[$i]}"
        if [[ $j == --* ]] ; then
            (( i<len )) && [[ ${COMP_WORDS[$(( i + 1))]} == '=' ]] && j="$j="
            words=( "${words[@]/$j}" )
        fi
    done
}

原始版本的_exclude_cmd_line_opts的问题是${words [@] / $j}会给出一个假的=例如words =(param1 =)和j =“param1”(请注意$j中缺少的尾随等号)这是由COMP_WORDBREAKS引起的..)

更新

我发现了另一个特点.以上案例工作正常,因为我从来没有输入< tab>在=符号后立即.但是,如果例如words =( – param = –param-info),我输入–par< tab>仍然有两个候选人完成,目前的单词只是部分完成成为–param.在此,我想选择两个候选中的第一个,并在命令行上键入一个显式=符号,然后键入< tab>现在发生的事情是Bash认为你输入了一个空格(因为COMP_WORDBREAKS包含=),当前完成字从–param =变为=.这再次,将使Bash readline省略插入通常的空间,因此用户被迫键入空格以继续完成下一个选项.

通过返回带有空字符串的COMPREPLY数组,可以避免在上述情况下键入空格.

_myprog()
{
    local cur="${COMP_WORDS[$COMP_CWORD]}"
    local prev=""
    (( COMP_CWORD > 0 )) && prev="${COMP_WORDS[$(( COMP_CWORD - 1))]}"
    [[ $cur == '=' && $prev == --* ]] && { COMPREPLY=( "" ); return; }

    local words=(--param= --param-info)
    _exclude_cmd_line_opts
    COMPREPLY=( $(compgen -W "${words[*]}" -- "$cur") )
}

(编辑:李大同)

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

    推荐文章
      热点阅读