bash完成_parse_help坏了吗?

时间:2012-02-27 23:24:28

标签: bash command-line-arguments bash-completion command-line-parsing

为了让我的脚本命令行开关轻松完成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?

1 个答案:

答案 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!