我有一个 bash 自动完成功能_customcomplete
,我想在一个名为run.sh
. 如果我调用complete -F _customcomplete ./run.sh
,那么只要我在同一目录中并使用 调用它,自动完成脚本就可以正常工作./run.sh
。但是,如果我上一层并使用 调用它./scripts/run.sh
,则自动完成脚本不起作用。更重要的是,如果我与另一个名为 的脚本位于不同的目录中run.sh
,则自动完成脚本在不应该的情况下会在该目录上运行。
简而言之,是否可以将 bash 自动完成功能绑定到特定的可执行文件,而不是调用字符串?
这是一个完整的简化示例:
Incompletion.sh
是一个非常简单的完成脚本,它总是返回三个选项one two three
:
_customcomplete() {
local word="${COMP_WORDS[COMP_CWORD]}"
COMPREPLY=( $(compgen -W "one two three" -- "$word") )
}
我可以使用source completion.sh
并验证它的来源type _customcomplete
:
_customcomplete is a function
_customcomplete() {
local word="${COMP_WORDS[COMP_CWORD]}"
COMPREPLY=( $(compgen -W "one two three" -- "$word") )
}
在一个目录中,我有两个文件夹scripts
和other
,它们都包含一个名为run.sh
. 每个都只是回显命令行参数以及一个独特的消息来区分两者。
现在让我们尝试通过 cd'ing 进入脚本目录并运行来将完成函数注册到run.sh
in 。现在我可以调用并使用制表符完成来查看. 但是,如果我尝试从上面的目录中调用它 as ,我会得到默认的文件系统选项卡完成建议。此外,如果我进入,自定义选项卡完成也适用于该脚本。scripts
complete -F _customcomplete ./run.sh
./run.sh
one two three
./scripts/run.sh
cd
other
将命令更改complete
为链接到任何类型的全局路径仅在使用与调用字符串完全相同的全局路径时才允许自定义选项卡完成。我想要发生的是能够通过任何相对路径调用脚本并让自定义选项卡完成按预期工作。