【问题标题】:bash completion _parse_help broken?bash 完成_parse_help 坏了?
【发布时间】:2014-06-26 03:52:33
【问题描述】:

为了让脚本的命令行开关轻松完成 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 输出的命令行补全标准方法?

【问题讨论】:

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


    【解决方案1】:

    根据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
    

    开心!

    【讨论】:

    • 啊,是的,这行得通。完美的。非常感谢,我真的想不通!
    猜你喜欢
    • 1970-01-01
    • 2021-11-13
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多