bash 中带有等号 (=) 的自动完成问题

dch*_*kov 6 shell bash autocomplete

我正在尝试使Bash 自动完成工作并编写这段代码来演示我遇到的问题:

$ cat completion.sh
function _completion_command() {
    compopt +o bashdefault +o default +o dirnames +o filenames +o nospace +o plusdirs
    local cur=${COMP_WORDS[COMP_CWORD]}
    local prev=${COMP_WORDS[COMP_CWORD-1]}
    case "$prev" in
        -u)
            compopt -o nospace
            COMPREPLY=($(compgen -S\= -W "parm" -- $cur))
            return 0
            ;;
         parm)
            COMPREPLY=($(compgen  -W "a b c" -- $cur))
            return 0
            ;;
    esac
    COMPREPLY=($(compgen  -W "-u" -- $cur))
    return 0
}
complete -F _completion_command command
Run Code Online (Sandbox Code Playgroud)

我希望完成为名为“parm”的参数提供可能的参数:

. completion.sh
./command -u parm=
Run Code Online (Sandbox Code Playgroud)

Tab Tab

a b c
Run Code Online (Sandbox Code Playgroud)

但就我而言,自动完成功能对我没有任何帮助。

Evg*_*gin 2

prev包含parm
cur包含=
compgen -W "a b c" -- =不输出任何内容

您可以使用_get_comp_words_by_refbash -completion

source bash-completion # /usr/share/bash-completion/bash_completion on Ubuntu with bash-complete installed

function _completion_command() {
  local cur prev
  _get_comp_words_by_ref -n = cur prev
  case "$prev" in
    -u)
      case "$cur" in
        parm=*)
          COMPREPLY=($(compgen -W "a b c" -- ${cur#*=}))
          return 0;
          ;;
        *)
          compopt -o nospace
          COMPREPLY=($(compgen -S\= -W "parm" -- $cur))
          return 0;
          ;;
      esac
      ;;
  esac

  COMPREPLY=($(compgen  -W "-u" -- $cur))
}

complete -F _completion_command command
Run Code Online (Sandbox Code Playgroud)