You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求适用于POSIX shell脚本的函数列表获取方案,兼容dash亦可

获取POSIX/Dash脚本中的可对外调用函数列表

要在POSIX兼容的shell(比如dash)中实现自动提取脚本里的可对外调用函数,用来更新帮助界面,我们没法依赖bash专属的declare -F这类命令,不过可以通过文本解析脚本自身内容的方式实现,完全符合POSIX标准,在dash里也能正常运行。

核心思路

POSIX标准的shell函数定义有两种格式(dash都支持):

  1. 简洁格式:public_func() { ... }
  2. 兼容格式:function public_func() { ... }

我们可以通过正则匹配这两种格式的函数定义行,提取函数名,再用grep筛选你标记的对外函数(比如名称带cmd_前缀这类特定模式)。

实现代码

在你的脚本里添加以下函数,用来提取符合要求的函数名:

# 提取当前脚本中所有可对外调用的函数名(需替换YOUR_PATTERN为你的标记模式)
get_public_functions() {
    awk '
        # 跳过注释行
        !/^#/ && 
        # 匹配POSIX兼容的函数定义行
        /^(function[[:space:]]+)?[a-zA-Z0-9_]+[[:space:]]*\(\)/ {
            # 去掉可能的"function"前缀
            sub(/^(function[[:space:]]+)?/, "", $1)
            # 去掉函数名后的()及空格
            sub(/[[:space:]]*\(\)/, "", $1)
            print $1
        }
    ' "$0" | grep -E "YOUR_PATTERN"
}

在帮助界面中使用

接下来,在你的帮助函数里调用它,自动展示最新的可调用命令:

show_help() {
    echo "Usage: $0 <command> [args...]"
    echo -e "\nAvailable commands:"
    echo "-------------------"
    # 遍历提取到的对外函数,逐个展示
    get_public_functions | while read -r cmd; do
        echo "  $cmd"
        # 可选:如果函数上方有注释说明,还可以扩展提取注释(比如匹配函数前的# Description:行)
        # awk -v cmd="$cmd" 'BEGIN{flag=0} $0 ~ cmd"\\(" {flag=1; next} flag && /^# Description:/ {sub(/^# Description: /, "", $0); print "    " $0; flag=0}' "$0"
    done
}

关键注意事项

  • 替换标记模式:把代码里的YOUR_PATTERN换成你对外函数的识别规则,比如如果所有对外函数都以cmd_开头,就改成^cmd_;如果包含_public后缀,就改成_public$。
  • 避免匹配注释:代码里已经通过!/^#/跳过了注释行,不会误提取注释里写的函数名。
  • 格式兼容性:确保你的函数定义符合POSIX标准,不要用bash专属的复杂写法(比如函数名里带特殊字符,或者定义格式偏离标准)。

这个方案完全依赖POSIX标准工具(awk、grep、read),在dash里可以完美运行,每次新增符合规则的对外函数,帮助界面都会自动更新,不用手动维护命令列表。

内容的提问来源于stack exchange,提问作者bamm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 19:22:55