Dans le tiret, les fonctions et les variables semblent vivre dans des espaces de noms distincts:
fn(){
fn="hello world"
}
fn; echo "The value is $fn!" #prints: The value is hello world!
fn; echo "The value is $fn!" #prints: The value is hello world!
#the fn variable doesn't conflict with the fn function
Est-ce une fonctionnalité spécifique au tableau de bord ou une garantie POSIX?
fn
fonction se trouve dans un espace de noms séparé; si l'exécuter une fois avait effacé sa définition, nous verrions exactement le même comportement. Vous devez montrer que la fonction est toujours définie, par exemple avectype fn
après.Réponses:
Une garantie :
la source
unset
a-v
et-f
pour choisir entre la suppression de la variable ou de la fonction par le nom donné.bash
(contrairement à la plupart des autres shells) désactive lafoo
fonction avecunset foo
s'il n'y a pas defoo
variable (!), un comportement autorisé par POSIX. C'est pourquoi dans les scripts POSIX, il est recommandé de toujours utiliser l'un-v
ou l' autre-f
(et bien sûr dans lesbash
scripts également, mais notez queunset
cela ne désactive pas toujours une variable dansbash
, labash
portée des variables a pas mal de problèmes).Les variables et les fonctions résident dans différents espaces de noms dans le tiret et cela est également spécifié par POSIX :
En plus de cela, les variables ont une portée globale, par défaut. Certains shells (par exemple bash, ksh et zsh) fournissent le
local
mot - clé pour déclarer les variables dans une fonction à portée locale uniquement.Donc, oui, le comportement que vous voyez est garanti par POSIX.
Posix n'a pas normalisé
local
, encore :(c'est moi qui souligne)
la source
local
, l'une des interfaces les plus cohérentes (par rapport à celle gravement cassée dans bash par exemple), bash vient récemment (4.4) d'emprunter lelocal -
(pour la portée locale pour options) de ash (implémentation de la portée de style ash pour cette seule$-
variable). ksh et yash n'en ont paslocal
(seules les variantes pdksh en ontlocal
), mais en ont à latypeset
place (dans ksh93typeset
fournit une portée locale (statique) uniquement dans les fonctions déclarées en utilisant la syntaxe ksh).