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输出?
根据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!