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 Functions
définit la syntaxe d'une fonction shell à
function name [()] compound-command [redirection]
puis (ailleurs dans le manuel) le jeton name
est 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 PATH
variable 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::def
sur stdout.
la source
%%
dans les noms de fonction unix.stackexchange.com/questions/401166/…Réponses:
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::def
ne s'agit pas d'un nom de variable valide:la source
file::read
plus[}{
que le posix valide