环境

环境

我正在研究 Bash 的可编程完成,但有些东西我不太明白。

环境

这是我bash --version在终端中运行时得到的结果。

GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

我正在运行这一切Ubuntu 22.04.2 LTS

我有两个文件。

文件 1(脚本)

第一个是我想要可编程完成的脚本,如下所示:

#!/usr/bin/env bash
#Script: dothis
echo "COMMAND: $0 $@"

正如您所看到的,这是一个虚拟脚本,它打印脚本的名称,后跟参数。

文件 2(可编程完成脚本)

第二个文件是负责前面脚本的可编程完成的文件,如下所示:

#!/usr/bin/env bash

_dothis_completions(){
    # -S suffix
    COMPREPLY=($(compgen -A user -S '_suffix'  "${COMP_WORDS[1]}"))

    # -P prefix
    #COMPREPLY=($(compgen -A user -P 'prefix_'  "${COMP_WORDS[1]}"))
}

 complete -F _dothis_completions dothis

当我将它与选项-S(为建议附加后缀)一起使用时,它工作得很好。它为我提供了系统中不同用户的建议,并附_suffix在最后。

现在,如果我修改可编程完成的脚本,如下所示:

#!/usr/bin/env bash

_dothis_completions(){
    # -S suffix
    #COMPREPLY=($(compgen -A user -S '_suffix'  "${COMP_WORDS[1]}"))

    # -P prefix
    COMPREPLY=($(compgen -A user -P 'prefix_'  "${COMP_WORDS[1]}"))
}

 complete -F _dothis_completions dothis

(请注意,现在我想使用该-P标志将前缀附加prefix_到所有建议中)

我在命令行中再次尝试,这是行不通的

有谁知道为什么这不起作用?

预先非常感谢!

更新(2023 年 7 月 29 日)

我决定使用 Zsh 中的 Bash 的可编程补全功能,并且似乎工作没有问题。

希望这些信息能够帮助我们找到“-P”标志在 Bash 中无法正常工作的原因的答案。

答案1

问题是,compgen -P ...只有当只剩下一种选择时,这似乎才有意义。也许您可以通过在生成补全时删除前缀来解决此问题。

我的建议是检查是否已输入任何内容以及是否只剩下一个补全。这可能不适用于两个值,其中一个是另一个的第一部分,例如

  • 富巴

foo那时你无法选择。

_dothis_completions(){

    local -a tmp_array=()

    # -S suffix
    #COMPREPLY=($(compgen -A user -S '_suffix'  "${COMP_WORDS[1]}"))

    # -P prefix
    if [ -z "${COMP_WORDS[COMP_CWORD]}" ]; then
        COMPREPLY=($(compgen -A user "${COMP_WORDS[1]}"))
    else
        tmp_array=( $(compgen -A user "${COMP_WORDS[1]}") )
        if [ "${#tmp_array[@]}" -eq 1 ]; then
            COMPREPLY=($(compgen -A user -P 'prefix_'  "${COMP_WORDS[1]}"))
        else
            COMPREPLY=($(compgen -A user "${COMP_WORDS[1]}"))
        fi
    fi
}

complete -F _dothis_completions dothis

相关内容