4

经过数小时的搜索,我最终写出了我的第一个 stackoverflow 问题。

我想为 bash 脚本创建一个完成函数,到目前为止一切都很好;)。此 bash 脚本调用具有自己的自动完成功能的其他可执行文件。

例子:

$ my_script foo par
  # calls /usr/local/libexec/my_script/foo par

自动完成 my_script 的第一个参数(在本例中为“foo”)有效,因为可能的选项是文件夹“/usr/local/libexec/my_script/”中的文件。此文件夹中的每个程序都具有工作自动完成功能,这是使用 boost::program_options 的副产品。

我现在想通过引用要调用的程序的自动完成来实现 my_script 的下一个参数的自动完成。

$ my_script foo <tab>
  # should output possible options to the foo subcommand
  # like /usr/local/libexec/my_script/foo <tab>

我已经从另一个完成的这个答案开始,但是_command_command_offset 1似乎对我不起作用。

  • 如何获得foo的选项,以及如何在 my_script 中使用它?

我当前的/etc/bash_completion.d/my_script如下所示

_my_script()
{
  local cur prev opts
  COMPREPLY=()
  cur="${COMP_WORDS[COMP_CWORD]}"
  prev="${COMP_WORDS[COMP_CWORD-1]}"

  if [[ "$COMP_CWORD" == 1 ]]; then
    # 1. param: for program to be loaded
    for i in $( ls /usr/local/libexec/my_script/ ); do
      opts="${opts} ${i} "
    done
    COMPREPLY=( $(compgen -W "${opts}" ${cur}) )
  else
    # next param: of the program to be loaded

    # how do I get the options of "foo" here?        

  fi

  return 0
}
complete -F _my_script my_script
4

1 回答 1

0

我一读到您的问题,就想到了完成sudogit浮现在我的脑海。它们都具有您想要的相似行为。所以我寻找他们的完成功能。这是您缺少的行:

local root_command=${COMP_WORDS[0]}
_command_offset 1

/usr/share/bash-completion/completions/sudo它是从Ubuntu 16.04 中复制而来的。我完全不知道它的意思。但它有效。

于 2018-01-31T17:56:30.947 回答