编辑:
我意识到我在这篇文章中的一个中心假设是错误的:${!prefix@}
语法不能获取函数名,只能获取变量。因此,${!prefix@}
即使使用下划线,也无法返回函数名。因此,我在下面的粗体问题的答案是明确的“不”。 尽管如此,下面 Edgar 的回答对于那些想要获得基于某个前缀的函数名称列表的人来说还是很有帮助的。
原始问题
bash 参数扩展手册为我们提供了一种方法来获取当前环境中以某个前缀开头的所有变量(非函数)的列表:
${!prefix@}
我有一堆函数都foo-
以. 我尝试过, , ,和许多其他变体。我知道连字符在参数扩展中具有其自身的含义,因此可以预期,如果没有一些转义等,它将无法工作。但我也希望 Bash 应该有在任何上下文中转义特殊字符的机制,包括在参数扩展期间,除非......也许这里不是这种情况?foo-setup
foo-run
foo-initialize
${!foo-@}
foo-
${!foo\-@}
"${!foo\-@}"
"${!foo-@}"
bar=foo; ${!${bar}-@}
-
(我已经研究过这样一个事实,如果我想要跨平台兼容性,我应该避免使用连字符的函数名称。我同意这一点。而且,使用连字符而不是下划线键入函数要顺畅得多。 ..)
因此,本着探究的精神,我提出了一个问题:有没有办法使用本机参数扩展来获取所有以连字符前缀开头的已定义函数列表(或一般的 namerefs)?也许解决方案是以我不知道的方式转义连字符?
(如果没有,是否有替代方法,也许是通过获取变量的完整列表,然后过滤它们以仅留下具有所需连字符前缀的变量?)
有替代方法吗?
是的,您可以使用
declare
orcompgen
获取已定义函数的列表:解决方案 1(它将匹配包含指定字符串/模式的函数)
解决方案2(特别是匹配前缀/以特定字符串/模式开头)
关于使用参数扩展,我不确定是否可以获取函数名称。根据手册,它似乎只适用于变量:
还有你说的:
我想知道你是否尝试过并且它有效(我不认为),因为我用一些功能测试过它并且没有用。
当然,您不能使用连字符定义变量
-
,因此无法使用${prefix-@}
or${prefix-*}
。为了完整起见,如果您想获取与 zsh 中的模式匹配的函数名称列表,您可以这样做:
(替换
+f
为-f
还可以查看这些函数的定义)。但是请注意,zsh 中的函数名称可以是任何字节序列(毕竟它们与命令在同一个命名空间中,文件路径可以是任何非空字节的非空序列),因此输出不可后处理可靠。
但是,您可以通过查找匹配模式
k
的特殊$functions
关联数组的眼睛来获取数组中的列表M
:具有奇怪命名函数的示例: