Условное конечное пространство c программируемым завершением bash

Я создаю функцию для обеспечения программируемого завершения команды, которую я использую (с большой помощью http://www.debian-administration.org/articles/317). Использование сценария оболочки выглядит следующим образом:

script.sh command [command options]

где команда может быть " foo " или "bar", а параметры команды для " foo " - "a_foo=value" и "b_foo=value", а параметры команды для " bar " - "a_bar=value" и "b_bar=value".

здесь конфигурация я использование:

_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 value" вместо "--a_foo=value".

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;;