根据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
开心!