我一直在尝试将bash完成支持添加到我最近使用的命令行程序中,但似乎我已经撞上了墙。嵌套的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函数,但目前我不知道该怎么做。如果你对如何实现这一点也有建议,我会很感激。
谢谢!