为了让我的脚本命令行开关轻松完成bash,我一直在探索/ etc / bash_completion中的_parse_help函数(debian sid,bash v4.2-1,bash-completion v1:1.99-3)
我的脚本以我认为标准的GNU格式生成帮助消息:
MYSCRIPT [OPTIONS]
Usage:
-h, --help Show this help message
-o, --option Some option
然后我通过complete -F _parse_help ./myscript
激活完成。
不幸的是,这并没有给出理想的结果。在第一个选项卡./myscript <TAB>
(注意,只需一个按键)时,会出现一个未格式化的列表,其中包含--help和--option,而不是缩短的版本。更糟糕的是,任一选项的完成都失败了。实际上,只需键入短划线就会导致_parse_help完全停止生成输出。
整件事感觉非常破碎,我在网上找不到太多参考。这个功能可能被认为是过时的吗?是否有另一种基于解析的命令行完成的标准方法--help output?
答案 0 :(得分:5)
根据bash reference manual -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!