首页 > 解决方案 > 如何完成具有多个参数/选项的 bash 函数?

问题描述

我为命令定义了一个函数别名:aa我定义了一个_complete_aa函数,该函数用作aa命令的建议complete -F _complete_aa aa(参见下面的代码)

aa(){
    anothercommand ${@}
}

_complete_aa(){
    COMPREPLY=($(compgen -W "clean build start" "${COMP_WORDS[1]}"))
}

complete -F _complete_aa aa

当我使用该功能时,我有一个意外的行为:

当我键入aa cle并按TAB提示正确完成我的输入aa clean

但是,当我键入aa clean bui并按下TAB时,提示符会将我的输入完成为aa clean clean,而我希望它应该变为aa clean build

我想我的错误出在下面的补全函数中,它不关心当前完成的单词的索引。

_complete_aa(){
    COMPREPLY=($(compgen -W "clean build start" "${COMP_WORDS[1]}"))
}

问题:我应该如何更改函数的主体,以便为我输入的每个新选项/参数_complete_aa完成当前单词?clean build start

标签: bashcode-completion

解决方案


COMP_WORDS使用当前单词索引的索引。

aa() {
    anothercommand "$@"
}

_complete_aa() {
    COMPREPLY=($(compgen -W "clean build start" "${COMP_WORDS[$COMP_CWORD]}"))
}

complete -F _complete_aa aa

the"${COMP_WORDS[1]}"始终是命令后的第一个单词。


推荐阅读