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

Hex*_*nic 9 bash function

我有一个很长的 bash 脚本。如果我能列出其中的所有功能,那就太好了。更好的是列出函数的名称和任何关于它的用法的文档,例如参数。

小智 15

通常的方法是使用declare -fwhich 将在交互式 bash shell 中打印很长的函数列表。但是在脚本内部,由于大多数外部函数都没有定义,所以列表会很短而且很有用。

所以:

declare -f
Run Code Online (Sandbox Code Playgroud)

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

declare -F
Run Code Online (Sandbox Code Playgroud)

将仅打印名称函数列表。

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


Gil*_*il' 6

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

grep -E '^[[:space:]]*([[:alnum:]_]+[[:space:]]*\(\)|function[[:space:]]+[[:alnum:]_]+)' myscript
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

bash -c '. myscript; typeset -f'
Run Code Online (Sandbox Code Playgroud)