我现在的情况是,我需要为一系列应用程序设置 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
。 :-)