undokumentierte Verhaltensänderung von 'lokal' in Bash 4.3 eingebaut?

7

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.)

Alexis Huxley
quelle
Zugegeben, dass die über Git erhältliche Upstream-Version dieses Verhalten rückgängig gemacht hat, war es wahrscheinlich ein Fehler
Undercat applaudiert Monica am

Antworten:

4

Auszüge aus dem Bash-Changelog:

Dieses Dokument beschreibt die Änderungen zwischen dieser Version, bash-4.4-alpha, und der vorherigen Version, bash-4.3-release.

3. Neue Funktionen in Bash

f. Die -pOption zum Deklarieren und ähnliche integrierte Funktionen zeigt Attribute für benannte Variablen an, auch wenn diesen Variablen keine Werte zugewiesen wurden (die technisch nicht festgelegt sind).


In diesem Dokument werden die Änderungen zwischen dieser Version, bash-4.3-alpha, und der vorherigen Version, bash-4.2-release, beschrieben.

1. Änderungen an Bash

hhhh. Ein Fehler wurde behoben , dass verursacht declareund testVariablen zu finden , die Attribute gegeben , aber nicht zugewiesenen Werte hatte. Solche Variablen werden nicht gesetzt.

Beachten Sie, dass dies localnur ein Alias ​​für ist declare, mit der Ausnahme, dass localFehler auftreten, wenn sie nicht innerhalb einer Funktion aufgerufen werden.

Es sieht so aus, als ob das typeset -pAuflisten nicht festgelegter Variablen als Fehler angesehen wurde, aber dann wurde das Verhalten rückgängig gemacht, da das declare -pAuflisten solcher Variablen „eine ausreichend häufige Anforderung“ ist .

Gilles 'SO - hör auf böse zu sein'
quelle