Nomi delle funzioni di script Bash che contengono due punti "::"


17

Oggi mi sono imbattuto in uno script Bash che ha nomi di funzioni con due punti ::in doppio , ad esempio, file::write()e file::read(). Non ho mai visto questa sintassi prima in uno script Bash, e quando ho invocato lo script è andato tutto bene (con mia sorpresa).

Dopo aver cercato la pagina man di Bash sul mio sistema (e online), non riesco a trovare nulla nella documentazione che supporti questa sintassi per i nomi delle funzioni. Ad esempio, la sezione Shell Defined Functionsdefinisce la sintassi per una funzione shell

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

e quindi (altrove nel manuale) il token nameè definito come

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.

Non c'è alcun riferimento alla sintassi dei due punti per i nomi delle funzioni.

L'unico altro riferimento a questa sintassi a due punti che ho trovato finora è in questa Shell Style Guide (vedere la sottosezione Naming Conventions > Function Names) che raccomanda di usare la sintassi a due punti per i nomi delle funzioni in "pacchetti" - ad es mypackage::myfunction().

Questa sintassi a due punti per i nomi delle funzioni è una caratteristica legittima della shell Bash o è forse una caratteristica non documentata? Se è legittimo, dove è documentato nel manuale di Bash? Ho guardato e guardato ma non riesco a trovare nulla al riguardo nel manuale. L'ho trovato'VE più vicino è l'uso di ::nella PATHvariabile d'ambiente per aggiungere la directory di lavoro corrente al percorso di ricerca.

ESEMPIO

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

Ho testato questo script su tre diverse distribuzioni Linux e su tutti e tre gli script vengono stampati abc::defsu stdout.



Si può anche vedere %%nei nomi delle funzioni unix.stackexchange.com/questions/401166/…
michael

Grazie per i collegamenti. Dispari. Prima di pubblicare ho cercato "bash double colon" (senza virgolette) ma non ho trovato nulla. Ci scusiamo per avermi ripetuto una domanda già risposta. .
Jim Fischer

Risposte:


16

Questo è un caso in cui la documentazione è più rigorosa dell'implementazione, probabilmente nel tentativo di ridurre il fattore footgun. Questo è stato discusso qui prima ; vedere anche il test esaustivo che stabilisce che, ad esempio, [}{è un nome di funzione valido.

Vale anche la pena notare che abc::defnon è un nome di variabile valido:

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

4
solo per renderlo vividamente chiaro - non è file::readnemmeno [}{valido posix
Steven Penny
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.