在 bash 完整功能中禁用 COMPREPLY 排序

tij*_*agi 6 bash autocomplete

我有一个单词列表,这些单词应该按照完成某个键的出现顺序出现,但是 bash 似乎在内部对分配给COMPREPLY数组的内容进行排序。如何避免这种情况?

例子:

_comm() {
    _init_completion -s -n : || return
    case $prev in
        -a) COMPREPLY=(zxy abcdef tyuu fgsfds)
            ;;
    esac
}
complete -F _comm comm
Run Code Online (Sandbox Code Playgroud)

如果您运行此代码,bash 应该会完成

$ comm -a 
Run Code Online (Sandbox Code Playgroud)

abcdef fgsfds tyuu zxy
Run Code Online (Sandbox Code Playgroud)

即按字母顺序排序。

小智 8

从 Bash 4.4 开始,您可以使用nosort选项。在您的示例中,将最后一行更改为

complete -o nosort -F _comm comm
Run Code Online (Sandbox Code Playgroud)

并且您应该在没有字母排序的情况下获得完成。

重要说明:选项(用 指定-o)必须在函数 ( -F)之前。这就是 coderofsalvation 的代码不起作用的原因。