0

我想在 shell 脚本(我正在采购的 shell 脚本函数库)中生成所有函数的列表。目前,我正在尝试以下方式排版:

typeset -f
typeset -F
typeset -F | awk -F"declare -f " '{print $2}' | grep -v '_'

我遇到的一个困难是列出了一些不在函数库中的函数,我不知道如何从函数列表中删除这些函数或如何以更好的方式生成函数列表。我欢迎您对此有任何想法。

一个好处是按照函数在 shell 脚本中出现的顺序生成函数列表。

4

2 回答 2

1

我假设 bash 是外壳。排版(或声明)显示当前环境,函数是环境的一部分:

  • 环境中没有固有的顺序(名称按输出排序)
  • 不需要的功能可能是从环境中继承的,之前已使用 declare -x 标记为导出

您可以尝试使用“env”在干净的环境中启动脚本,尝试:

env -i "PATH=$PATH" "TERM=$TERM" "LANG=$LANG" myscript.sh

作为起点。

此处记录了在 bash 中枚举函数的最佳方法:Where is function's declaration in bash? 请注意,“declare -F”不会规范化文件名,它将被调用/获取。

while read xx yy fn; do
    func=( $(shopt -s extdebug; declare -F $fn) )
    printf  "%-30s %4i %-30s\n" "${func[@]:2}" "${func[1]}" "${func[0]}"
done < <(declare -F)

您需要做的就是按所需文件名过滤,然后按行号排序。

于 2013-01-08T11:23:25.853 回答
1

我的一种方法如下(代码包含在函数库脚本中):

initialListOfFunctionsInEnvironment="$(typeset -F | awk -F"declare -f " '{print $2}')"
# declare functions
finalListOfFunctionsInEnvironment="$(typeset -F | awk -F"declare -f " '{print $2}')"
diff  <(echo "${initialListOfFunctionsInEnvironment}" ) <(echo "${finalListOfFunctionsInEnvironment}") | grep -E '^(<|>)' | awk -F"> " '{print $2}'

这似乎会生成一个简单的列表,其中列出了在获取函数库脚本时添加到环境中的所有函数。对这种方法的批评将不胜感激。

于 2013-01-08T13:29:24.613 回答