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 nospacecomplete모두옵션 뒤에 공백이 추가됩니다.전혀. 코드는 다음과 같습니다.

#/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 " "공백이 다시 추가되지 않습니다.

관련 정보