我有一个相当长的 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 "^_"