如何将带参数的函数传递给另一个函数

6

我正在尝试编写一个通用的自动完成函数(实际上需要多个参数,并且具有许多共享逻辑),以便我可以轻松整洁地维护长列表中的类似命令和类似自动完成(参数数量等)。

我已经有了一个bash函数,它接受一个参数(尽可能简化):

_autocomplete() {
    COMPREPLY=( $(compgen -W "$1" -- "${COMP_WORDS[COMP_CWORD]}") )
    return 0
}

当我引用它时,使用一个需要函数名作为参数的命令,我也想传递一个参数以在函数中运行:

complete -F "_autocomplete example_param" some_function

然而,当我按tab键时,这个方法不起作用,并出现以下错误:
some_function bash: completion: function `_autocomplete example_param' not found

这是complete的限制吗?
有没有其他方法可以解决,或者更好的方案?

谢谢。


使用“-C”来指定命令。 - Barmar
1个回答

2

-F选项后面只需跟一个函数名。如果你想要用选项执行一个命令,需要使用-C。但是该命令需要将补全内容打印到标准输出,而不是设置COMPREPLY。因此,请修改函数为:

-F选项应仅跟随一个函数名。如果您想要使用选项执行带有选项的命令,则需要使用-C选项。但是,该命令需要将补全内容打印到标准输出,而不是设置COMPREPLY变量。因此,请将该函数更改为:

_autocomplete() {
    COMPREPLY=( $(compgen -W "$1" -- "${COMP_WORDS[COMP_CWORD]}") )
    for reply in "${COMPREPLY[@]}"
    do
        printf '%s\n' "$reply"
    done
    return 0
}

complete -C "_autocomplete example_param" some_function

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接