根据参数位置智能 Bash 完成

根据参数位置智能 Bash 完成

我有一个简单的 bash 函数,基本上是 scp 的包装器。调用使用

copytomachine <Machine> <File>

我设置了一些简单的自动完成功能,这样当我输入时

copytomachine <TAB><TAB>

它向我提供了可用机器的列表,目前只是一个硬编码的序列,这足以满足我的需求。

如果我输入

copytomachine BUILD_SERVER <TAB><TAB>

我希望它为我提供目录中的文件列表,并能够自动完成它们的路径等。但是,我不希望为第一个参数(计算机名称)向我提供此文件列表。

我当前的完成脚本如下所示:

_machines_completions()
{
    local opts
    opts="BUILD_SERVER TEST_SERVER LOCAL_MACHINE"
    COMPREPLY=( $(compgen -W "${opts}" -- ${COMP_WORDS[COMP_CWORD]}) )
    return 0
}

谁能告诉我如何修改它,以允许我对参数 1 的这些定义的机器名称进行制表符补全,并对参数 2 上的文件名进行制表符补全?

答案1

由于COMP_CWORD是单词编号,您可以测试它的值:

_machines_completions()
{
    local opts
    opts="BUILD_SERVER TEST_SERVER LOCAL_MACHINE"
    case $COMP_CWORD in
        1)
            COMPREPLY=( $(compgen -W "${opts}" -- "${COMP_WORDS[COMP_CWORD]}") )
            ;;
        2)
            COMPREPLY=( $(compgen -o default -- "${COMP_WORDS[COMP_CWORD]}") )
            ;;
    esac
    return 0
}

-o default将要:

如果 compspec 未生成匹配项,则使用 Readline 的默认文件名完成。

答案2

如果您想要文件名的默认完成行为,请运行compopt -o default.

另一个答案建议将 COMPREPLY 设置为compgen -o default,这很接近但不完全相同的行为(尝试自动完成目录名称以查看差异)。

相关内容