bash完成_parse_help坏了吗?

ger*_*jan 2 bash command-line-arguments command-line-parsing bash-completion

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

我的脚本生成一个帮助消息,我认为是标准的GNU格式:

MYSCRIPT [OPTIONS]

Usage:
  -h, --help     Show this help message
  -o, --option   Some option
Run Code Online (Sandbox Code Playgroud)

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

不幸的是,这并没有产生预期的结果.在第一个选项卡上./myscript <TAB>(注意,只需一个按键),将显示一个未格式化的列表,其中包含--help和--option,而不是缩短的版本.更糟糕的是,任一选项的完成都失败了.实际上,只需键入短划线就会导致_parse_help完全停止生成输出.

整个事情感觉非常破碎,我在网上找不到太多的参考.这个功能可能被认为是过时的吗?是否有另一种基于解析的命令行完成的标准方法--help输出?

nic*_*kl- 5

根据bash参考手册,-F function期望从变量中读取单词列表COMPREPLY

似乎_parse_help没有设置这个必需的变量,因此不适合作为函数complete -F.从执行函数可以明显看出输出是回显的.

$ _parse_help ./myscript 
-h
--help
-o
--option
Run Code Online (Sandbox Code Playgroud)

@gertjan您尝试的内容可以使用该-W wordlist选项完成.

$ complete -W "$(_parse_help ./myscript)" ./myscript 
$ ./myscript -
--help    --option  -h        -o
$ ./myscript --
--help    --option
$ ./myscript --help
Run Code Online (Sandbox Code Playgroud)

完成按预期工作--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  
Run Code Online (Sandbox Code Playgroud)

如您所见,即使显示了选项,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
Run Code Online (Sandbox Code Playgroud)

的nJoy!