Имена функций сценария Bash, содержащие двойное двоеточие '::'

17

Сегодня я натолкнулся на скрипт Bash, в котором есть имена функций с двойными двоеточиями ::, например, file::write()и file::read(). Я никогда раньше не видел этот синтаксис в скрипте Bash, и когда я вызывал скрипт, он работал нормально (к моему удивлению).

После просмотра справочной страницы Bash в моей системе (и в сети) я не могу найти ничего в документации, которая поддерживает этот синтаксис для имен функций. Например, раздел Shell Defined Functionsопределяет синтаксис для функции оболочки, которая будет

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 Guide Style (см подраздела Naming Conventions > Function Names) , который рекомендует использовать двойной синтаксис двоеточия для имен функций в «пакетах» - например, mypackage::myfunction().

Является ли этот синтаксис с двойным двоеточием для имен функций допустимой функцией оболочки Bash, или это недокументированная функция? Если это законно, где это описано в руководстве по Bash? Я посмотрел и посмотрел, но я не могу найти ничего об этом в руководстве. Ближайший я нашел применение ::в PATHпеременной окружения , чтобы добавить текущую рабочую директорию на пути поиска.

ПРИМЕР

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

Я протестировал этот скрипт на трех разных дистрибутивах Linux и на всех трех скриптах печатал abc::defна стандартный вывод.

Джим Фишер
источник
Они разрешены - stackoverflow.com/questions/44558080/…
slm
Можно также увидеть %%в именах функций unix.stackexchange.com/questions/401166/…
майкл
Спасибо за ссылки. Странный. До публикации я искал "bash double двоеточие" (без кавычек), но ничего не нашел. Извиняюсь за повторное задание уже отвеченного вопроса. ,
Джим Фишер

Ответы:

16

Это тот случай, когда документация является более строгой, чем реализация, возможно, в попытке снизить фактор, влияющий на наличие ножек. Это обсуждалось здесь раньше ; см. также исчерпывающий тест, устанавливающий, что, например, [}{допустимое имя функции.

Также стоит отметить, что abc::defэто недопустимое имя переменной:

$ abc::def=foo
bash: abc::def=foo: command not found
l0b0
источник
4
просто чтобы прояснить это ясно - не так file::readи [}{не действует posix
Стивен Пенни