В случае возможных подкоманд на первом уровне это немного неясно для меня.Можно ли ввести foo --activate
или foo - --activate
?Последний выглядит как-то странно, но больше подходит под ваш код.Первое звучит более разумно, но подразумевает, что --activate
и т. Д. Как глобальный параметр, который должен обрабатываться на том же уровне, что и ваши подкоманды.Я еще ничего не вошел.Попробуйте следующий код:
_foo() {
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
words=("${COMP_WORDS[@]}")
cword=$COMP_CWORD
opts="process version help"
case "$prev" in
-*)
local subopts="--activate --deactivate"
COMPREPLY=( $(compgen -W "${subopts}" -- ${cur}) )
case "$cur" in
--deactivate)
COMPREPLY=( $(ls) )
;;
esac
return 0
;;
version)
COMPREPLY=()
return 0
;;
process)
case "$cur" in
-*)
local subopts="--color --verbose"
COMPREPLY=( $(compgen -W "${subopts}" -- ${cur}) )
;;
*)
COMPREPLY=( $(compgen -A directory))
;;
esac
return 0
;;
help)
COMPREPLY=( $(compgen -W "process version" -- ${cur}) )
return 0
;;
esac
COMPREPLY=($(compgen -W "${opts}" -- ${cur}))
return 0
}
complete -F _foo foo
, который в основном совпадает с вашим, но: Внизу установите COMPREPLY на ваши подкоманды первого уровня, чтобы они были выполнены.В случае ввода подкоманды вы должны вернуть (0), чтобы не достигнуть окончательного утверждения.
Приведенный пример будет работать с foo - --activate
, что может не соответствовать вашему желанию.Поэтому, если вы хотите ввести foo --activate
, измените соответствующие строки на
case "$prev" in
--activate)
COMPREPLY=()
return 0
;;
--deactivate)
COMPREPLY=( $(compgen -W "$(ls)" -- ${cur}) )
return 0
;;
version)
...