Im Bindestrich scheinen Funktionen und Variablen in separaten Namespaces zu leben:
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
Handelt es sich um eine dash-spezifische Funktion oder eine POSIX-Garantie?
fn
Funktion in einem separaten Namespace befindet. Wenn die einmalige Ausführung die Definition gelöscht hätte, würden wir genau dasselbe Verhalten feststellen. Sie sollten zeigen, dass die Funktion noch definiert ist, zB mittype fn
danach.Antworten:
Eine Garantie :
quelle
unset
hat-v
und-f
zwischen unsetting die Variable oder Funktion mit dem gegebenen Namen zu wählen.bash
(im Gegensatz zu den meisten anderen Schalen gegen) wird unset diefoo
Funktion mit ,unset foo
wenn es keinefoo
Variable (!), ein Verhalten von POSIX erlaubt. Aus diesem Grund ist es in POSIX-Skripten empfehlenswert, immer entweder-v
oder zu verwenden-f
(und natürlich auch inbash
Skripten. Beachten Sie jedoch, dass dasunset
Setzen einer Variablen in nicht immer möglich istbash
, da dasbash
Variablenscoping einige Probleme aufweist).Variablen und Funktionen befinden sich in verschiedenen Namespaces im Bindestrich. Dies wird auch von POSIX angegeben :
Darüber hinaus haben Variablen standardmäßig einen globalen Gültigkeitsbereich. Einige Shells (z. B. bash, ksh und zsh) bieten das
local
Schlüsselwort zum Deklarieren von Variablen in einer Funktion mit ausschließlich lokalem Gültigkeitsbereich.Ja, das Verhalten, das Sie sehen, wird von POSIX garantiert.
POSIX ist nicht standardisiert
local
, doch :(Hervorhebung von mir)
quelle
local
, eines der beständigsten Schnittstellen gibt ( im Vergleich zu der stark ein in bash zum Beispiel gebrochen), bash erst vor kurzem nur (4.4) der geliehenelocal -
für (für die lokalen Bereich options) from ash (Implementierung eines$-
Aschestils nur für diese eine Variable). ksh und yash haben nichtlocal
(nur die pdksh-Varianten habenlocal
), sonderntypeset
(in ksh93typeset
wird lokaler (statischer) Geltungsbereich nur in Funktionen bereitgestellt, die mit der ksh-Syntax deklariert wurden).