Імена функцій сценарію Bash, що містять подвійну двокрапку '::'


17

Сьогодні я натрапив на сценарій Bash, який містить назви функцій із подвійними двокрапками ::, наприклад, file::write()та file::read(). Я ніколи не бачив цього синтаксису в сценарії 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до stdout.


Їм дозволено - stackoverflow.com/questions/44558080/…
slm

Можна також побачити %%у назвах функцій unix.stackexchange.com/questions/401166/…
michael

Дякуємо за посилання. Незвичайно. До публікації я шукав "bash double colon" (без котирувань), але нічого не знайшов. Вибачення за повторне ставлення вже відповіді. .
Джим Фішер

Відповіді:


16

Це випадок, коли документація суворіша, ніж реалізація, можливо, у спробі зменшити коефіцієнт пістолета. Про це вже йшлося раніше ; див. також вичерпний тест, який встановлює, що, наприклад, [}{є дійсною назвою функції.

Можливо, варто також зазначити, що abc::defце невірна назва змінної:

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

4
просто щоб зробити це яскраво ясно - НЕ file::readні [}{діє POSIX
Стівен Пенні
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.