【问题标题】:get path relative to executable in bash auto completion在bash自动完成中获取相对于可执行文件的路径
【发布时间】:2016-04-19 22:20:42
【问题描述】:

在我的项目中,我在$PROJECTROOT/bin/ 中有所有可执行文件。主可执行文件$PROJECTROOT/bin/run 可以加载带有参数-p 的插件,例如./bin/run -p plugin1。所有插件都在$PROJECTROOT/plugins/。我想为$PROJECTROOT/plugins/ 中的所有插件添加自动完成功能。因此,我需要访问与bin/run 中的二进制文件相关的plugins 目录,因为我想从任何地方运行可执行文件,例如我可能想运行~/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

【问题讨论】:

  • ${COMP_WORDS[0]}中的命令不是吗?
  • @EtanReisner,你是对的!谢谢 - 如果您将此添加为答案,我会接受。

标签: bash autocomplete


【解决方案1】:

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

您可以使用它来运行正在运行的命令。但是,如果该命令是从 $PATH 运行的,那将无济于事,因为该命令只是裸名(并且不包含供您使用的路径),因此您也需要处理它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 2012-01-02
    • 2016-05-26
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多