Ing*_*her 17 bash bash-completion
我目前有一个Bash完成文件,它从一个允许的脚本命令列表(称为"pbt")中完成一个参数.这是工作Bash完成文件:
_pbt_complete()
{
local cur goals
COMPREPLY=()
cur=${COMP_WORDS[COMP_CWORD]}
goals='asadmin clean deploy'
cur=`echo $cur`
COMPREPLY=($(compgen -W "${goals}" ${cur}))
}
complete -F _pbt_complete pbt
Run Code Online (Sandbox Code Playgroud)
所以,如果我打电话
pbt <tab>
Run Code Online (Sandbox Code Playgroud)
Bash完成所有允许的命令(asadmin,clean,deploy),这没关系.
现在我想在完成时添加"第二"级别.所以例如,如果我输入
pbt asadmin <tab>
Run Code Online (Sandbox Code Playgroud)
它应该完成所有只在asadmin-"环境"中可用的选项(我也将在bash完成文件中定义),例如,pbt asadmin [start-domain|stop-domain]
但是如果我输入
pbt deploy <tab>
Run Code Online (Sandbox Code Playgroud)
例如,它应该完成另一组选项pbt deploy [all|current]
.因此第二个命令的选项应始终取决于第一个命令.我怎么能在完成文件中这样做?
Ing*_*her 25
感谢mkb的评论,我查看了p4示例,这与Git示例不同;) - 简单到让我适应我的情况.这是工作版本,它完全符合我的要求:
have pbt &&
_pbt_complete()
{
local cur prev
COMPREPLY=()
cur=${COMP_WORDS[COMP_CWORD]}
prev=${COMP_WORDS[COMP_CWORD-1]}
if [ $COMP_CWORD -eq 1 ]; then
COMPREPLY=( $(compgen -W "asadmin deploy" -- $cur) )
elif [ $COMP_CWORD -eq 2 ]; then
case "$prev" in
"asadmin")
COMPREPLY=( $(compgen -W "start-domain stop-domain" -- $cur) )
;;
"deploy")
COMPREPLY=( $(compgen -W "all current" -- $cur) )
;;
*)
;;
esac
fi
return 0
} &&
complete -F _pbt_complete pbt
Run Code Online (Sandbox Code Playgroud)