我有一个很长的 bash 脚本。如果我能列出其中的所有功能,那就太好了。更好的是列出函数的名称和任何关于它的用法的文档,例如参数。
小智 15
通常的方法是使用declare -f
which 将在交互式 bash shell 中打印很长的函数列表。但是在脚本内部,由于大多数外部函数都没有定义,所以列表会很短而且很有用。
所以:
declare -f
Run Code Online (Sandbox Code Playgroud)
将列出函数(和定义)。和:
declare -F
Run Code Online (Sandbox Code Playgroud)
将仅打印名称函数列表。
有一个(不太好用)选项extdebug
,如果设置,每个函数定义的行号也将被打印出来declare -F
。但extdebug
需要在脚本加载时设置(因为需要知道所有行才能列出它们)。
通常,在不执行脚本的情况下列出所有函数是不可能的,因为函数可以由类似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)