2

我不确定这个问题的好名字,所以如果你能想到一个更好的名字,请重命名它。

在 Bash 中,我有一个函数用于存储某些函数。考虑:

menv_funcs=()

function menv_function {
  menv_funcs+=($1)
}

然后我以这种方式使用它:

menv_function fetch
function fetch {
  ...
}

我想像这样使用它:

menv_function fetch {
  ...
}

本质上,我正在寻找类似于 C 中的预处理器宏的东西,但我一直找不到方法。有任何想法吗?

4

1 回答 1

4

据我所知,你不能直接实现这一点。但是,我可以想到您可能感兴趣的两种解决方案。

首先,你可以像往常一样声明函数,然后通过declare -F. 这可以这样做:

function fetch {
    :
}

menv_funcs=()
while IFS=$"\n" read l; do
    menv_funcs+=${l#declare -f }
done < <(declare -F)

这将导致menv_funcs[@]列出在调用代码段时声明的所有函数。当然,这也可能会捕获不需要的功能。

为避免这种情况,您可以在函数名称中添加一些前缀并过滤列表:

function menv_fetch {
    :
}

menv_funcs=()
while IFS=$"\n" read l; do
    if [[ ${l} == 'declare -f menv_'* ]]; then
        menv_funcs+=${l#declare -f menv_}
    fi
done < <(declare -F)

如果你真的想实现宏之类的东西,你可以尝试玩eval

menv_funcs=()

function menv_function {
    local name=${1}
    local body=${2}

    menv_funcs+=( ${name} )
    eval "function ${name} ${body}"
}

menv_function fetch "{
    :
}"

但请注意,您实际上需要引用整个函数体并适当地转义所有内容。

于 2013-11-06T20:57:53.440 回答