我正在努力使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
我期望完成能为名为“parm”的参数提供可能的参数:
. completion.sh
./command -u parm=
Tab Tab
a b c
但就我而言,自动完成功能没有为我提供任何帮助。
答案1
prev
包含parm
cur
包含=
compgen -W "a b c" -- =
不输出任何内容
您可以使用_get_comp_words_by_ref
从bash 完成:
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