Как выполнить функцию bash с несколькими параметрами / параметрами? - PullRequest
1 голос
/ 25 февраля 2020

Я определил псевдоним функции для команды: aa, и я определил функцию _complete_aa, которая используется в качестве рекомендации для команды aa через complete -F _complete_aa aa (см. Код ниже)

aa(){
    anothercommand ${@}
}

_complete_aa(){
    COMPREPLY=($(compgen -W "clean build start" "${COMP_WORDS[1]}"))
}

complete -F _complete_aa aa

Когда я использую функцию, у меня неожиданное поведение:

Когда я набираю aa cle и нажимаю TAB, приглашение правильно завершает мой ввод в aa clean

Но, когда Я набираю aa clean bui и нажимаю TAB, приглашение завершает мой ввод в aa clean clean, в то время как я ожидаю, что оно должно измениться на aa clean build.

Я предполагаю, что моя ошибка в приведенной ниже функции завершения, которая не заботится об индексе текущего слова в стадии завершения.

_complete_aa(){
    COMPREPLY=($(compgen -W "clean build start" "${COMP_WORDS[1]}"))
}

Вопрос: как мне изменить тело функции _complete_aa, чтобы получить завершение текущего слова в clean build start для каждого нового параметра / параметра, который я печатаю?

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Функция завершения получает позиционные параметры, из которых $2 является «завершаемым словом», так что вы можете сделать это:

_complete_aa(){
    COMPREPLY=($(compgen -W "clean build start" "$2"))
}

Если ваше завершение действительно является просто выбором заданных слов, вместо этого вы можете использовать более простое завершение -W:

complete -W 'clean build start' aa
1 голос
/ 25 февраля 2020

Индекс COMP_WORDS с индексом текущего слова.

aa() {
    anothercommand "$@"
}

_complete_aa() {
    COMPREPLY=($(compgen -W "clean build start" "${COMP_WORDS[$COMP_CWORD]}"))
}

complete -F _complete_aa aa

"${COMP_WORDS[1]}" всегда будет первым словом после команды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...