Как передать функцию с аргументами в другую функцию - PullRequest
4 голосов
/ 17 мая 2019

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

У меня есть функция bash, которая принимает аргумент (максимально упрощенный):

_autocomplete() {
    COMPREPLY=( $(compgen -W "$1" -- "${COMP_WORDS[COMP_CWORD]}") )
    return 0
}

И когда я ссылаюсь на него, используя команду, котораяпринимает имя функции в качестве аргумента, я также хочу передать ему параметр для запуска в функции:

complete -F "_autocomplete example_param" some_function

Однако, это не работает, когда я нажимаю клавишу Tab, и вместо этого ошибки с:

some_function bash: completion: function `_autocomplete example_param' not found

Это ограничение complete?
Есть ли способ обойти это или лучший подход?

Спасибо.

1 Ответ

2 голосов
/ 17 мая 2019

Предполагается, что за параметром -F следует только имя функции.Если вы хотите выполнить команду с параметрами, вам нужно использовать -C.Но команда требуется для вывода завершений на стандартный вывод, а не для установки COMPREPLY.Поэтому измените функцию на:

_autocomplete() {
    COMPREPLY=( $(compgen -W "$1" -- "${COMP_WORDS[COMP_CWORD]}") )
    for reply in "${COMPREPLY[@]}"
    do
        printf '%s\n' "$reply"
    done
    return 0
}

complete -C "_autocomplete example_param" some_function
...