我今天遇到了一个 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.
没有提到函数名称的双冒号语法。
到目前为止,我发现的对这种双冒号语法的唯一其他参考是在这个Shell 样式指南(参见小节Naming Conventions > Function Names
)中,它建议对“包”中的函数名称使用双冒号语法——例如,mypackage::myfunction()
.
函数名称的这种双冒号语法是 Bash shell 的合法特性,还是可能是未记录的特性?如果它是合法的,那么它在 Bash 手册中的哪里记录?我看了又看,但在手册中找不到任何关于它的内容。我发现最接近的是::
在PATH
环境变量中使用将当前工作目录添加到搜索路径。
例子
#!/bin/bash
function abc::def() {
echo "${FUNCNAME[0]}"
}
abc::def
我在三个不同的 Linux 发行版上测试了这个脚本,并且在所有三个上,脚本都打印abc::def
到标准输出。
这是文档比实施更严格的情况,可能是为了降低脚枪因素。这已经在这里讨论过;另请参见确定例如是有效函数名称的详尽测试。
[}{
值得注意的是,这
abc::def
不是一个有效的变量名: