Согласно справочному руководству bash -F function
ожидает чтения списка слов из переменной COMPREPLY
Может показаться, что _parse_help
не устанавливает эту обязательную переменную и поэтому не подходит в качестве функции для complete -F
. Выходные данные, очевидно, отражены, как видно из выполнения функции.
$ _parse_help ./myscript
-h
--help
-o
--option
@ gertjan То, что вы пытались сделать, может быть выполнено с использованием опции -W wordlist
.
$ complete -W "$(_parse_help ./myscript)" ./myscript
$ ./myscript -
--help --option -h -o
$ ./myscript --
--help --option
$ ./myscript --help
Завершение работает должным образом, и --h
завершит --help
или там, где было несколько аргументов, например, с "-", будет отображен только соответствующий параметр.
Если мы пытались использовать функцию, однако одного этого недостаточно, чтобы установить только COMPREPLY
, как вы увидите из следующего примера.
ПРИМЕЧАНИЕ: COMPREPLY
является массивом bash и требует скобок ()
при установке
$ function _myscript () {
> COMPREPLY=($(_parse_help ./myscript))
> }
$ complete -F _myscript ./myscript
$ ./myscript -
--help --option -h -o
$ ./myscript --
--help --option -h -o
$ ./myscript --help
--help --option -h -o
Как видите, несмотря на то, что параметры отображаются, complete
теперь ожидает, что мы выполним фильтрацию. Мы можем сделать это с помощью compgen
, но сначала нам нужно определить, против чего будет фильтроваться текущий аргумент. Функция _get_comp_words_by_ref
может помочь с этим, заполнив переменную $cur
, как в нашем последнем примере.
Полная реализация с использованием функции с _parse_help
для завершения bash.
$ function _myscript () {
> _get_comp_words_by_ref cur
> COMPREPLY=($(compgen -W "$(_parse_help ./myscript)" -- "$cur"))
> }
$ complete -F _myscript ./myscript
$ ./myscript -
--help --option -h -o
$ ./myscript --
--help --option
$ ./myscript --help
NJoy!