如何列出特定脚本中的所有函数和别名?

如何列出特定脚本中的所有函数和别名?

我有一个相当长的 Bash 脚本。如果我能列出其中的所有功能就太好了。更好的是列出函数的名称以及有关其用法的任何文档,例如参数。

答案1

通常的方法是使用declare -f它将在交互式 bash shell 中打印很长的函数列表。但在脚本内部,由于大多数外部函数未定义,因此该列表将简短且有用。

所以:

declare -f

将列出函数(和定义)。和:

declare -F

将仅打印名称函数列表。

有一个(不太好用)选项,extdebug如果设置了该选项,每个函数定义的行号也会被打印出来declare -F。但extdebug需要在脚本加载时设置(因为需要知道所有行才能列出它们)。

答案2

一般来说,在不执行脚本的情况下不可能列出所有函数,因为函数可以通过类似eval $(/some/program).但是,如果函数被“正常”声明,您可以搜索看起来像函数定义的内容。

grep -E '^[[:space:]]*([[:alnum:]_]+[[:space:]]*\(\)|function[[:space:]]+[[:alnum:]_]+)' myscript

shell 脚本中没有函数类型或文档功能,因此任何文档都必须来自注释。下面是一个粗略的 Perl 代码片段,它提取常用格式的函数定义以及紧邻的前面或后面的注释。

perl -0777 -ne '
    while (/^((?:[ \t]*\#.*\n)*)               # preceding comments
             [ \t]*(?:(\w+)[ \t]*\(\)|         # foo ()
                      function[ \t]+(\w+).*)   # function foo
             ((?:\n[ \t]+\#.*)*)               # following comments
           /mgx) {
        $name = "$2$3";
        $comments = "$1$4";
        $comments =~ s/^[ \t]*#+/#/mg;
        chomp($comments);
        print "$name\n$comments\n";
    }' myscript

如果您可以运行脚本而不产生任何副作用,或者如果您可以在下标中隔离所有函数定义,则打印函数名称的更精确方法是运行脚本,然后让 bash 打印出所有函数定义。与上面的文本搜索方法不同,这包括格式奇怪的函数定义并排除误报(例如在此处文档中),但这无法找到注释。

bash -c '. myscript; typeset -f'

答案3

declare -F | awk '{print $NF}' | sort | egrep -v "^_" 

相关内容