多级Bash完成

时间:2011-03-14 18:18:54

标签: 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

所以如果我打电话

pbt <tab>

Bash完成所有允许的命令(asadmin,clean,deploy),这没关系。

现在我想在完成时添加“第二”级别。例如,如果我输入

pbt asadmin <tab>

它应该完成所有仅在asadmin-“环境”中可用的选项(我也将在bash完成文件中定义),例如pbt asadmin [start-domain|stop-domain]但是如果我输入

pbt deploy <tab>

它应该完成另一组选项,例如pbt deploy [all|current]。因此第二个命令的选项应始终取决于第一个命令。我怎么能在完成文件中这样做?

2 个答案:

答案 0 :(得分:23)

感谢mkb的评论,我查看了p4-example,这与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

答案 1 :(得分:2)

作为一个例子,你可能想看看如何完成git的完成。 (在我的bash设置中,这需要2257行函数定义和另外14个变量。)