【发布时间】:2021-02-12 14:54:31
【问题描述】:
我有一个 Bourne Shell 脚本,其中包含多个函数,并允许通过以下方式调用:
my.sh <func_name> <param1> <param2>
在内部,func_name() 将被调用 param1 和 param2。
我想创建一个help 函数,它只列出所有可用的函数,即使没有参数。
问题:如何从脚本内部获取脚本中所有函数名的列表?
我想避免解析它并寻找函数模式。太容易出错了。
更新:代码。希望我的 help() 函数像 main() - 添加到代码中的函数会自动添加到帮助中。
#!/bin/sh
# must work with "set -e"
foo ()
{
echo foo: -$1-$2-$3-
return 0
}
# only runs if there are parameters
# exits
main ()
{
local cmd="$1"
shift
local rc=0
$cmd "$@" || rc=$?
exit $rc
}
if [[ "$*" ]]
then
main "$@"
die "how did we get here?"
fi
【问题讨论】:
-
“伯恩壳”?我不知道有任何 Linux 发行版提供了开箱即用的Bourne,或者曾经有过;
/bin/sh几乎是通用的 POSIX sh(几十年新的标准,具有一组非零的不兼容性;例如,Bourne 将^视为管道字符,POSIX sh 没有;Bourne 使用$[ ]表示数学,POSIX sh使用$(( ))等)。 -
@CharlesDuffy 你有消息来源吗?
-
@OleTange,是哪一部分? (我当然是依靠“在 Linux 上”来排除诸如 SunOS / 旧 Solaris 之类的情况,其中 POSIX sh 位于不同的位置,但是(1)在我的评论中被引用,并且(2)问题是这样的标记)。
-
@OleTange, ..and re:
$(( )),即使是 今天的 Heirloom Bourne 也不支持$(( ))进行数学运算。自己去heirloom.sourceforge.net/sh.html获取源码 -
...也就是说,我误认为
$[ ]是伯恩主义。 Bourne 的正确做法是使用expr进行数学运算。