2

为了让我的脚本的命令行开关轻松完成bash,我一直在探讨/ etc/bash_completion中的_parse_help函数(debian sid,bash v4.2-1,bash-completion v1:1.99-3)。bash完成_parse_help破?

MYSCRIPT [OPTIONS] 

Usage: 
    -h, --help  Show this help message 
    -o, --option Some option 

我然后通过complete -F _parse_help ./myscript激活完成:

我的脚本中我所相信的是标准的GNU格式生成帮助信息。

不幸的是,这并没有给出预期的结果。在第一个标签./myscript <TAB>(注意,只是一个按键)一个未格式化的列表出现包含--help和 - 选项,而不是缩短版本。更糟糕的是,任一选项的完成都失败了。事实上,只要输入破折号就会导致_parse_help完全停止生成输出。

整件事感觉非常糟糕,我在网上找不到多少参考。这个功能是否被认为是过时的?是否有另一种基于解析的命令行补全标准方法 - 帮助输出?

回答

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!

+0

啊,是的,那是有效的。完善。非常感谢,我真的无法弄清楚这一点! – gertjan 2012-12-26 10:41:28

+0

很高兴帮助! =) – 2012-12-27 14:00:51