Bash 完成未知命令名称(具有公共前缀)

Bash 完成未知命令名称(具有公共前缀)

我现在的情况是,我需要为一系列应用程序设置 bash 补全,这些应用程序的二进制文件都以相同的前缀开头——我们称之为 ... blargh。我不知道也不可能知道blargh*使用此完成程序的人的计算机上将拥有哪些应用程序(尽管在我的情况下,前缀足够唯一,不会干扰其他命令的正常操作)。

也就是说,我想做一些类似的事情:

complete -F _function_name "blargh*" "./blargh*"

现在,我得到的是一个非常普通的完成程序:

# blargh-completions.bash

_blargh_completions () {
    COMPREPLY=...
}

_blargh_init_completions () {
    local blargh
    for blargh in blarghABC blarghXYZ blargh123 blarghXXX-debug blarghARGH ; do
        complete -F _blargh_completions "$blargh"
        complete -F _blargh_completions "./$blargh"
    done
}

_blargh_init_completions

我对应用程序名称有了一个不错的初步猜测,但我仍然必须指示用户仔细检查脚本并for根据需要更新其本地副本的循环,这并不理想。

另外,我有点不清楚我要去哪里安装处理多个程序的完成脚本。所有选项有缺点:

  • 我可以把它放进去兼容目录(例如/etc/bash_completion.d/):这让脚本可以使用多个命令,但同时所有文档都表明此位置已被弃用,不应使用。
  • 我可以把它放进去完成目录(例如/usr/share/bash-completion/completions/):除了脚本必须与此目录中的命令具有相同的名称,所以我不知道如何使其在这种情况下工作。
  • 我可以将其附加到用户的~/.bash_completion文件中,除非自动更新/卸载变得困难。

所以我的问题是:我如何(如果可能的话)编写并安装适用于通配符名称模式的完成脚本,就像blargh*提前不知道精确的命令名称一样?

答案1

不幸的是,该complete命令不支持命令名称通配符/前缀。

但是,您也许可以引入一个名为 的包装函数blargh,该函数采用后缀(我认为是一个子命令名称),然后为其创建一个 bash 完成函数:


blargh() {
    command "blargh$@"
}

_blargh_completion() {
    ((COMP_CWORD >= 1)) || return
    local subcommand="${COMP_WORDS[1]}"
    if ((COMP_CWORD == 1)); then
        # ${subcommand} is a prefix
        # emit subcommand names that start with it
    else
        # complete arguments for the ${subcommand}
    fi
}

complete -F _blargh_completion blargh

这种方式blarghcreate ...也可以被调用,blargh create ...并且后一种调用方式可以自动完成。然后就可以将其放入,/usr/share/bash-completion/completions/blargh因为从技术上讲,它是命令的完成blargh。 :-)

相关内容