编辑:
我意识到我在这篇文章中的一个中心假设是错误的:${!prefix@}
语法不能获取函数名,只能获取变量。因此,${!prefix@}
即使使用下划线,也无法返回函数名。因此,我在下面的粗体问题的答案是明确的“不”。 尽管如此,下面 Edgar 的回答对于那些想要获得基于某个前缀的函数名称列表的人来说还是很有帮助的。
原始问题
bash 参数扩展手册为我们提供了一种方法来获取当前环境中以某个前缀开头的所有变量(非函数)的列表:
${!prefix@}
我有一堆函数都foo-
以. 我尝试过, , ,和许多其他变体。我知道连字符在参数扩展中具有其自身的含义,因此可以预期,如果没有一些转义等,它将无法工作。但我也希望 Bash 应该有在任何上下文中转义特殊字符的机制,包括在参数扩展期间,除非......也许这里不是这种情况?foo-setup
foo-run
foo-initialize
${!foo-@}
foo-
${!foo\-@}
"${!foo\-@}"
"${!foo-@}"
bar=foo; ${!${bar}-@}
-
(我已经研究过这样一个事实,如果我想要跨平台兼容性,我应该避免使用连字符的函数名称。我同意这一点。而且,使用连字符而不是下划线键入函数要顺畅得多。 ..)
因此,本着探究的精神,我提出了一个问题:有没有办法使用本机参数扩展来获取所有以连字符前缀开头的已定义函数列表(或一般的 namerefs)?也许解决方案是以我不知道的方式转义连字符?
(如果没有,是否有替代方法,也许是通过获取变量的完整列表,然后过滤它们以仅留下具有所需连字符前缀的变量?)