Сегодня я натолкнулся на скрипт 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
на стандартный вывод.
источник
%%
в именах функций unix.stackexchange.com/questions/401166/…Ответы:
Это тот случай, когда документация является более строгой, чем реализация, возможно, в попытке снизить фактор, влияющий на наличие ножек. Это обсуждалось здесь раньше ; см. также исчерпывающий тест, устанавливающий, что, например,
[}{
допустимое имя функции.Также стоит отметить, что
abc::def
это недопустимое имя переменной:источник
file::read
и[}{
не действует posix