Обработка завершения Bash после/внутри открытой одинарной/двойной кавычки

Я хотел бы предоставить предложения для аргумента, который должен быть процитирован вот так:

$ cmdx 1starg 'argtwoa %1 %x argtwob'

Взаимодействие должно происходить так (ожидание):

$ cmdx 1starg '[TAB TAB]
argtwoa argtwoc %1
$ cmdx 1starg 'argtwob[TAB TAB]
argtwoa argtwoc %1
$ cmdx 1starg 'argtwob 

Однако, если я набрал первое слово (одно из предложенных) в качестве второго аргумента, Bash не приводит дополнительных примеров, а закрывает открытую цитату:

$ cmdx 1starg 'argtwob' 

Моя функция завершения выглядит так:

function _complete() {
    local cur prev args
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"

    # echo "## prev=|$prev| cur=|$cur| words=[$COMP_CWORDS[@]] word=|${COMP_CWORD}| ##"

    if [ ${COMP_CWORD} -eq 1 ]; then
        args="1starg"

        COMPREPLY=( $(compgen -W "${args}" -- ${cur}) )
        return 0
    elif [ ${COMP_CWORD} -ge 1 ]; then
        args="argtwoa argtwob argtwoc %1"

        if [[ "${cur}" =~ ^\'[^[:space:]]+[[:space:]]$ ]]; then
            args="%1"
        fi

        COMPREPLY=( $(compgen -W "${args}" -- ${cur}) )

        # echo "####|${COMREPLY}|#|${args}|####"
        return 0
    fi
}

complete -F _complete cmdx

Когда я раскомментирую вторую отладку-echo и нажимаю вкладку после того, как второй аргумент был открыт с одинарной кавычкой, первым словом и пробелом, а затем нажимаю TAB, я ожидаю, что «%» будет напечатано как предложение. Вывод отладки подтверждает, что мой код верен, пока не запустится compgen:

$ cmdx 1starg 'argtwoa ####||#|%1|####

Я подозреваю, что невозможно сделать то, что я хочу, поскольку полученное значение args является правильным, но не значение COMPREPLY (отлажено с использованием echo).

То же самое должно работать и для двойных кавычек (я знаю, что мне нужно расширить код).


person try-catch-finally    schedule 01.03.2014    source источник
comment
Вы смотрели на Правильную обработку пробелов и кавычек в дополнении bash ?   -  person Michael Kropat    schedule 02.03.2014
comment
Кому: что это за манера голосовать за близко непонятно, что спрашивает ТО вместо того, чтобы оставить комментарий или просто двигаться дальше.   -  person try-catch-finally    schedule 04.03.2014