In bash 4.2, eine Variable als lokal zu einer Funktion deklariert , aber ohne einen Standardwert nontheless tritt in die Liste der Variablen - zumindest so weit wie ‚declare -p‘ angeht:
vermicelli$ bash --version | grep release
GNU bash, version 4.2.37(1)-release (x86_64-pc-linux-gnu)
vermicelli$ bash -c 'f1() { local Y; declare -p Y; }; f1'
declare -- Y
vermicelli$
In Bash 4.3 ist dies jedoch nicht mehr der Fall:
lasagne$ bash --version | grep release
GNU bash, version 4.3.46(1)-release (x86_64-pc-linux-gnu)
lasagne$ bash -c 'f1() { local Y; declare -p Y; }; f1'
bash: line 0: declare: Y: not found
lasagne$
Ist diese Verhaltensänderung irgendwo dokumentiert?
Wenn ein Standardwert angegeben wird (z. B. 'local Y' in 'local Y = 42' ändern), verhalten sich beide Bash-Versionen gleich.
(Ich habe die Manpage von bash 4.3 überprüft, insbesondere die Absätze, die sich mit dem Deklarieren und den lokalen Buildins befassen, die shopt-Option compatible42 sowie die FAQ, insbesondere den Absatz, der sich mit den Neuerungen in 4.3 befasst, aber ich finde sie nicht jede Erwähnung dieser Verhaltensänderung.)
Antworten:
Auszüge aus dem Bash-Changelog:
Beachten Sie, dass dies
local
nur ein Alias für istdeclare
, mit der Ausnahme, dasslocal
Fehler auftreten, wenn sie nicht innerhalb einer Funktion aufgerufen werden.Es sieht so aus, als ob das
typeset -p
Auflisten nicht festgelegter Variablen als Fehler angesehen wurde, aber dann wurde das Verhalten rückgängig gemacht, da dasdeclare -p
Auflisten solcher Variablen „eine ausreichend häufige Anforderung“ ist .quelle