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


17

我今天遇到了一个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 Style Guide》(请参阅小节Naming Conventions > Function Names)中找到了对此双冒号语法的唯一其他参考,该指南建议对“包”中的函数名使用双冒号语法-例如,mypackage::myfunction()

函数名称的这种双冒号语法是Bash shell的合法功能,还是未公开的功能?如果合法,Bash手册中将其记录在哪里?我已经看了看,但是在手册中找不到任何有关它的信息。我发现最接近的是::PATH环境变量中使用,将当前工作目录添加到搜索路径。

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

我在三个不同的Linux发行版上测试了该脚本,并在所有三个脚本上将其打印abc::def到stdout。



人们可能还会%%在函数名称中看到unix.stackexchange.com/questions/401166/…–
michael

感谢您的链接。奇。在发布之前,我搜索了“ bash double冒号”(不含引号),但未找到任何内容。很抱歉再次提出已回答的问题。。
吉姆·菲舍尔

Answers:


16

这是文档比实现更严格的情况,可能是为了尝试降低踩踏因素。这已经在这里讨论过了;另请参见详尽的测试,例如确定[}{是有效的函数名称。

可能还值得注意的abc::def是不是有效的变量名:

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

4
只是为了清楚地表明这一点-posix file::read也不[}{是有效的
Steven Penny
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.