我有一个简单的 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
,这很接近但不完全相同的行为(尝试自动完成目录名称以查看差异)。