使用bash可编程完成为条件结尾间隔(Conditional trailing space with

2019-06-23 14:18发布

我创建一个函数来提供,我使用一个命令可编程完成(与太多的帮助http://www.debian-administration.org/articles/317 )。 shell脚本的用法如下:

script.sh command [command options]

其中命令可以是“富”或“棒”和命令选项为“富”是“a_foo =值”和“b_foo =值”和命令选项关于“酒吧”是“a_bar =值”和“b_bar =值” 。

下面是我使用的配置:

_script() {
  local cur command all_commands                                                                    
  COMPREPLY=()
  cur="${COMP_WORDS[COMP_CWORD]}"
  command="${COMP_WORDS[1]}"
  all_commands="foo bar"
  case "${command}" in
    foo)
      COMPREPLY=( $(compgen -W "--a_foo --b_foo" -- ${cur}) ); return 0;;
    bar)
      COMPREPLY=( $(compgen -W "--a_bar --b_bar" -- ${cur}) ); return 0;;
    *) ;;
  esac
  COMPREPLY=( $(compgen -W "${all_commands}" -- ${cur}) )
  return 0
}

complete -F _script script.sh

这主要是工程,我想:

% script.sh f[TAB]

完成对:

% script.sh foo 

(具有如所期望的尾随空格)

然而,这样的:

% script.sh foo a[TAB]

完成对:

% script.sh foo a_foo 

(还带有一个空格)

我想用一个“=”来代替尾随空格。 另外,我很愿意改变传递给compgen值是“--a_foo = --b_foo =”,在这种情况下,我可能只是删除尾随的空间。

不幸的是,该命令是不是我的控制之下,所以我不能改变的命令行选项来进行格式的“--a_foo价值”,而不是“--a_foo =价值”。

Answer 1:

首先,你需要=添加到COMPREPLY:

COMPREPLY=( $(compgen -W "--a_foo= --b_foo=" -- ${cur}) )

接下来,你需要告诉建成,与=后添加空间

compopt -o nospace

所以,你台词应该是:

foo)
  COMPREPLY=( $(compgen -W "--a_foo= --b_foo=" -- ${cur}) ); compopt -o nospace; return 0;;
bar)
  COMPREPLY=( $(compgen -W "--a_bar= --b_bar=" -- ${cur}) ); compopt -o nospace; return 0;;


文章来源: Conditional trailing space with bash programmable completion