据我所知,你不能直接实现这一点。但是,我可以想到您可能感兴趣的两种解决方案。
首先,你可以像往常一样声明函数,然后通过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 "{
:
}"
但请注意,您实际上需要引用整个函数体并适当地转义所有内容。