compgen -o nospace 选项无效

compgen -o nospace 选项无效

我正在尝试创建一个命令完成功能,并且我正在关注本指南。它大约是这样的:

function __my_completion ()
{
    local cur prev opts opts_log opts_import
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts="-h --help -d --directory -v --version -l --log-level -q --quiet"
    opts_log="trace debug info warn err critical off"

    if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then
        COMPREPLY=( $(compgen -o nospace -d -W "${opts}" -- ${cur}) )
        return 0
    fi
    case "${prev}" in
        -d|--directory)
            COMPREPLY=( $(compgen -o nospace -d ${cur}) )
        ;;
        -l|--log-level)
            COMPREPLY=( $(compgen -W "${opts_log}" -- ${cur}) )
        ;;
    esac
}

complete -F __my_completion myProg

我的问题是:每当完成任何单词时,都会在末尾添加一个空格。这对于普通选项来说很好,但它也适用于目录,尽管有-o nospace -d选项组合。这非常烦人,因为它会减慢导航速度并且非常不直观。

这是为什么?我该如何纠正?

?另外,当我在这里时,链接指南中的示例之一的单曲是什么?它在队列中

COMPREPLY=( $(compgen -f ? ${cur}) )

答案1

至少是部分解决方案:虽然compgen忽略该-o nospace选项,但complete尊重它。可悲的是,这意味着要么全部选项后面添加了空格,或者没有任何。这是代码:

#/usr/bin/env bash

function __my_completion ()
{
    local cur prev opts opts_log
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts="-h --help -d --directory -v --version -l --log-level -q --quiet"
    opts_log="trace debug info warn err critical off"
    local opts_dir=( $(compgen -d -S "/" -- ${cur}) )

    if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then
        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ${opts_dir[@]} )
        return 0
    fi
    case "${prev}" in
        -d|--directory)
            COMPREPLY=( ${opts_dir[@]} )
        ;;
        -l|--log-level)
            COMPREPLY=( $(compgen -W "${opts_log}" -- ${cur}) )
        ;;
    esac
}

complete -o nospace -F __my_completion myProg

添加-S " "到其他选项也不会重新添加空格。

相关内容