根据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正如您将在下一个示例中看到的那样。
注意: 是一个 bash 数组,设置时COMPREPLY需要括号()
$ 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
开心!