在bash自动完成中获取相对于可执行文件的路径

时间:2016-04-18 13:26:04

标签: bash autocomplete

在我的项目中,我拥有$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

1 个答案:

答案 0 :(得分:1)

正在完成的命令的路径在${COMP_WORDS[COMP_CWORD]}中(与光标下的单词在$PATH中的方式相同)。

您可以使用它来运行命令。但是,如果从{{1}}运行命令,那将无法帮助您,因为命令只是一个裸名称(并且不包含您可以使用的路径),因此您需要处理那个。