我一直在尝试将 bash 补全支持添加到我最近一直在使用的命令行程序中,但似乎我碰壁了。
这是我想自动完成的命令和子命令
主命令为,子命令、、
foo
应自动补全。进一步的自动完成取决于子命令。version
process
help
如果用户
-
在主命令之后输入,自动补全会为这些单词执行补全:--activate
或--deactivate
如果用户输入
--deactivate
,它应该执行 bash 命令输出的自动完成(比如说ls
)。
version
: 没有执行自动完成process
:自动完成默认列出目录(包括当前目录和父目录)- 如果用户输入
-
,自动补全对这些单词执行补全:--color
,--verbose
然后停止
- 如果用户输入
如果用户输入
help
,则自动完成用于其他子命令(process
或version
)。
这是我当前对自动完成脚本的实现(严重失败):
_foo() {
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
words=("${COMP_WORDS[@]}")
cword=$COMP_WORD
opts="process version help"
case "$prev" in
-*)
local subopts="--activate --deactivate"
COMPREPLY=( $(compgen -W "${subopts}" -- ${cur}) )
case "$cur" in
--deactivate)
COMPREPLY=( $(ls) )
;;
esac
;;
version)
COMPREPLY=()
;;
process)
case "$cur" in
-*)
local subopts="--color --verbose"
COMPREPLY=( $(compgen -W "${subopts}" -- ${cur}) )
;;
*)
COMPREPLY=( $(compgen -A directory))
;;
esac
;;
help)
COMPREPLY=( $(compgen -W "process version" -- ${cur}) )
;;
esac
}
complete -F _foo foo
您可能会看到 Bash 也不是我的主要强项。我正在考虑为每个子命令编写单独的 bash 函数,但目前我不知道该怎么做。如果您对如何实现这一点也有建议,我将不胜感激。
谢谢!