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

时间:2019-05-17 00:38:07

标签: bash function parameters autocomplete

我正在尝试制作一个通用的自动完成功能(实际上需要几个参数,并且具有一堆共享逻辑),以便我可以轻松整齐地维护一长串具有类似自动完成功能的类似命令(数量参数等)。

我有一个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的限制吗?
有什么办法可以解决这个问题,还是更好的方法?

谢谢。

1 个答案:

答案 0 :(得分:2)

应该在-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