Bash 脚本函数名称包含双冒号 '::'

Bash 脚本函数名称包含双冒号 '::'

我今天遇到一个 Bash 脚本,::其中的函数名称中带有双冒号,例如file::write()file::read()。我以前从未在 Bash 脚本中见过这种语法,当我调用该脚本时,它运行得很好(令我惊讶)。

在我的系统(和在线)上搜索 Bash 的手册页后,我在文档中找不到任何支持此函数名称语法的内容。例如,本节Shell Defined Functions将 shell 函数的语法定义为

function name [()] compound-command [redirection]

然后(在手册的其他地方)令牌name被定义为

name   A word consisting only of alphanumeric characters and
       underscores, and beginning with an alphabetic character
       or an underscore.  Also referred to as an identifier.

没有任何地方提到函数名称的双冒号语法。

到目前为止我发现的对这个双冒号语法的唯一其他引用是在这个外壳风格指南(参见小节Naming Conventions > Function Names)它建议对“包”中的函数名称使用双冒号语法——例如,mypackage::myfunction().

函数名称的双冒号语法是 Bash shell 的合法功能,还是可能是未记录的功能?如果它是合法的,那么它在 Bash 手册中的记录在哪里?我看了又看,但在手册中找不到任何相关内容。我发现的最接近的是::在环境变量中使用PATH将当前工作目录添加到搜索路径。

例子

#!/bin/bash
function abc::def() {
    echo "${FUNCNAME[0]}"
}
abc::def

我在三个不同的 Linux 发行版上测试了这个脚本,并且在所有三个发行版上,脚本都打印abc::def到标准输出。

答案1

这是文档比实现更严格的情况,可能是为了降低枪炮因素。这已经是之前在这里讨论过;另请参阅详尽的测试例如建立[}{一个有效的函数名称。

还值得注意的是,这abc::def不是一个有效的变量名称:

$ abc::def=foo
bash: abc::def=foo: command not found

相关内容