Noms de fonction de script Bash contenant les deux-points '::'

17

Je suis tombé sur un script Bash aujourd'hui qui contient des noms de fonction avec des deux-points ::, par exemple, file::write()etfile::read() . Je n'ai jamais vu cette syntaxe auparavant dans un script Bash, et quand j'ai invoqué le script, cela s'est très bien passé (à ma grande surprise).

Après avoir parcouru la page de manuel de Bash sur mon système (et en ligne), je ne trouve rien dans la documentation qui supporte cette syntaxe pour les noms de fonction. Par exemple, la section Shell Defined Functionsdéfinit la syntaxe d'une fonction shell à

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

puis (ailleurs dans le manuel) le jeton nameest défini comme

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.

Il n'y a aucune mention nulle part de la syntaxe à deux points pour les noms de fonction.

La seule autre référence à cette syntaxe à deux points que j'ai trouvée jusqu'à présent se trouve dans ce Shell Style Guide (voir la sous-section Naming Conventions > Function Names) qui recommande d'utiliser la syntaxe à deux points pour les noms de fonction dans les "packages" - par exemple,mypackage::myfunction() .

Cette syntaxe à deux points pour les noms de fonction est-elle une caractéristique légitime du shell Bash, ou est-ce peut-être une fonctionnalité non documentée? Si c'est légitime, où est-il documenté dans le manuel Bash? J'ai regardé et regardé mais je ne trouve rien à ce sujet dans le manuel. Le plus proche que j'ai trouvé est l'utilisation de ::dans la PATHvariable d'environnement pour ajouter le répertoire de travail actuel au chemin de recherche.

EXEMPLE

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

J'ai testé ce script sur trois distributions Linux différentes, et sur les trois, le script s'imprime abc::defsur stdout.

Jim Fischer
la source
Ils sont autorisés - stackoverflow.com/questions/44558080/…
slm
On peut aussi voir %%dans les noms de fonction unix.stackexchange.com/questions/401166/…
michael
Merci pour les liens. Impair. Avant de poster, j'ai cherché "bash double colon" (sans les guillemets) mais je n'ai rien trouvé. Toutes mes excuses pour avoir posé une nouvelle question. .
Jim Fischer

Réponses:

16

Il s'agit d'un cas où la documentation est plus stricte que la mise en œuvre, peut-être dans le but de réduire le facteur du pistolet. Ceci a été discuté ici avant ; voir aussi le test exhaustif établissant que par exemple[}{ est un nom de fonction valide.

Il convient également de noter qu'il abc::defne s'agit pas d'un nom de variable valide:

$ abc::def=foo
bash: abc::def=foo: command not found
l0b0
la source
4
juste pour être clair - pas non file::readplus [}{que le posix valide
Steven Penny