我有一个 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
为链接到任何类型的全局路径仅在使用与调用字符串完全相同的全局路径时才允许自定义选项卡完成。我想要发生的是能够通过任何相对路径调用脚本并让自定义选项卡完成按预期工作。
似乎您想为命令的特定实例创建一个完成,无论它是如何调用的(通过绝对或相对路径),但不是其他可能共享相同名称但位于其他位置的命令。例如,您可能希望完成位于 的脚本
~/bin/example.sh
,但不是/usr/bin/example.sh
。根据Bash Reference Manual : 8.6 Programmable Completion,bash
complete
没有您想要的内置功能。但是,在您的_customcomplete
函数中,您可以使用 找到被调用脚本的位置readlink
,然后进行COMPREPLY
相应的自定义: