智能 Bash 完成取决于参数位置

Joe*_*y O 7 bash autocomplete

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

copytomachine <Machine> <File>
Run Code Online (Sandbox Code Playgroud)

我已经设置了一些简单的自动完成,这样当我输入

copytomachine <TAB><TAB>
Run Code Online (Sandbox Code Playgroud)

它向我展示了可用机器的列表,目前只是一个硬编码的序列,这对我的需求来说很好。

但是,如果我输入

copytomachine BUILD_SERVER <TAB><TAB>
Run Code Online (Sandbox Code Playgroud)

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

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

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

任何人都可以建议我如何修改它以允许我为参数 1 的这些定义的机器名称和参数 2 的文件名的制表符完成?

mur*_*uru 6

由于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
}
Run Code Online (Sandbox Code Playgroud)

-o default 将要:

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