在我的项目中,我拥有$PROJECTROOT/bin/
中的所有可执行文件。主要可执行文件$PROJECTROOT/bin/run
可以使用参数-p
加载插件,例如./bin/run -p plugin1
。所有插件都在$PROJECTROOT/plugins/
。我想为$PROJECTROOT/plugins/
中的所有插件添加自动完成功能。因此,我需要在plugins
中访问相对于我的二进制文件的bin/run
目录,因为我想从任何地方运行可执行文件,例如我可能想要运行~/myproject/bin/run -p plugin1
,并且应该检查~/myprojects/plugins
以获取可用插件列表。
如果我将可执行文件的路径设为$EXEC
,我可以使用$(dirname $EXEC)/../plugins
来访问插件目录。我尝试了EXEC=$0
,但这不起作用,因为$0
没有引用我想要自动完成的可执行文件。有没有办法在bash的自动完成功能中获取可执行文件的路径?
我的自动完成文件如下所示:
_run()
{
local cur prev opts base
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts="-d -p"
case "${prev}" in
-p)
local available_plugins=$(ls $(dirname $0)/../plugins)
# ^^^ this doesn't work
COMPREPLY=( $(compgen -W "${available_plugins}" -- ${cur}) )
return 0
;;
*)
;;
esac
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
}
complete -F _run run
答案 0 :(得分:1)
正在完成的命令的路径在${COMP_WORDS[COMP_CWORD]}
中(与光标下的单词在$PATH
中的方式相同)。
您可以使用它来运行命令。但是,如果从{{1}}运行命令,那将无法帮助您,因为命令只是一个裸名称(并且不包含您可以使用的路径),因此您需要处理那个。