如何获得shell脚本中的函数列表?

时间:2013-01-08 10:35:57

标签: linux list function shell typeset

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

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

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

奖励是按照函数在shell脚本中出现的顺序生成函数列表。

2 个答案:

答案 0 :(得分:1)

我认为bash是shell。 typeset(或声明)显示当前环境,函数是环境的一部分:

  • 环境中没有固有的排序(名称按输出排序)
  • 以前曾经从环境中继承了不需要的功能 使用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)

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

答案 1 :(得分: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}'

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