Nazwy funkcji skryptu Bash zawierające dwukropek „::”

17

Natknąłem skryptu bash dziś, że ma nazwy funkcji z podwójnym dwukropkiem ::w nich, na przykład, file::write()i file::read(). Nigdy wcześniej nie widziałem tej składni w skrypcie Bash, a kiedy wywołałem skrypt, działał on dobrze (ku mojemu zdziwieniu).

Po przeszukaniu strony podręcznika Basha w moim systemie (i online) nie mogę znaleźć niczego w dokumentacji, która obsługuje tę składnię dla nazw funkcji. Na przykład sekcja Shell Defined Functionsdefiniuje składnię funkcji powłoki

function name [()] compound-command [redirection]

a następnie (gdzie indziej w instrukcji) token namejest zdefiniowany jako

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.

Nigdzie nie ma wzmianki o składni podwójnego dwukropka dla nazw funkcji.

Jedyne inne odniesienie do tej składni dwukropka, które do tej pory znalazłem, znajduje się w tym Przewodniku po stylach powłoki (patrz podrozdział Naming Conventions > Function Names), który zaleca stosowanie składni podwójnego dwukropka dla nazw funkcji w „pakietach” - np mypackage::myfunction().

Czy ta podwójna składnia dwukropka dla nazw funkcji jest uzasadnioną funkcją powłoki Bash, czy może jest to funkcja nieudokumentowana? Jeśli jest to zgodne z prawem, to gdzie jest to udokumentowane w podręczniku Bash? Patrzyłem i szukałem, ale nie mogę znaleźć niczego na ten temat w instrukcji. Najbliższe, jakie znalazłem, to użycie ::w PATHzmiennej środowiskowej do dodania bieżącego katalogu roboczego do ścieżki wyszukiwania.

PRZYKŁAD

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

Testowałem ten skrypt na trzech różnych dystrybucjach Linuksa i na wszystkich trzech skryptach drukuje się abc::defna standardowe wyjście.

Jim Fischer
źródło
Można również zobaczyć %%w nazwach funkcji unix.stackexchange.com/questions/401166/…
michael,
Dzięki za linki. Dziwny. Przed opublikowaniem szukałem „bash double colon” ​​(bez cudzysłowów), ale nic nie znalazłem. Przepraszamy za ponowne zadanie pytania, na które już udzielono odpowiedzi. .
Jim Fischer,

Odpowiedzi:

16

Jest to przypadek, w którym dokumentacja jest bardziej rygorystyczna niż implementacja, być może w celu obniżenia współczynnika działania. Zostało to tutaj omówione wcześniej ; patrz także wyczerpujący test ustalający, że na przykład [}{jest prawidłową nazwą funkcji.

Warto również zauważyć, że abc::defnie jest to poprawna nazwa zmiennej:

$ abc::def=foo
bash: abc::def=foo: command not found
10b0
źródło
4
po prostu, aby było to wyraźnie jasne - nie jest file::readani [}{poprawny posix
Steven Penny