Dans bash 4.2, une variable déclarée comme locale à une fonction mais sans valeur par défaut entre néanless dans la list des variables – du less en ce qui concerne 'declare -p':
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$
Cependant, dans 4.3 bash ce n'est plus le cas:
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$
Est-ce que ce changement de comportement est documenté n'importe où?
Si une valeur par défaut est fournie (par exemple, replace «Y local» par «Y local 42»), les deux versions bash se comportent de la même manière.
(J'ai vérifié la page de manuel de bash 4.3, en particulier les paragraphes traitant de la déclaration et des constructions locales, l'option shopt compat42, ainsi que la FAQ, en particulier le paragraphe traitant des nouveautés de la 4.3, mais je ne trouve pas toute mention de ce changement de comportement.)
Extraits du bash changelog:
Ce document détaille les changements entre cette version, bash-4.4-alpha, et la version précédente, bash-4.3-release.
3. Nouvelles fonctionnalités dans Bash
F. L'option
-p
pour déclarer et les builtins similaires afficheront les attributes des variables nommées même si ces variables n'ont pas de valeurs assignées (qui sont techniquement non mises à jour).
Ce document détaille les changements entre cette version, bash-4.3-alpha, et la version précédente, bash-4.2-release.
1. Changements à Bash
hhhh. Correction d'un bug provoquant la
declare
et letest
pour find des variables qui avaient reçu des attributes mais pas de valeurs assignées. Ces variables ne sont pas définies.
Notez que local
est juste un alias pour declare
, sauf que local
bloque lorsqu'il n'est pas appelé dans une fonction.
Il semble que le fait d'avoir des variables typeset -p
list unset a été considéré comme un bogue, mais le comportement a été inversé car avoir declare -p
list ces variables est une requête assez courante .