mudança não documentada de comportamento de 'local' embutido no bash 4.3?

7

No bash 4.2, uma variável declarada como local para uma função mas sem um valor padrão, no entanto, entra na lista de variáveis - pelo menos até '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$ 

No entanto, no bash 4.3, este não é mais o caso:

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$ 

Esta mudança de comportamento é documentada em algum lugar?

Se um valor padrão for fornecido (por exemplo, alterar 'local Y' para 'local Y = 42'), as duas versões bash se comportarão da mesma forma.

(Eu verifiquei a página man do bash 4.3, particularmente os parágrafos que lidam com o declare e builtins locais, a opção shopt compat42, assim como o FAQ, particularmente o parágrafo lidando com o que há de novo no 4.3, mas eu encontre qualquer menção a essa mudança de comportamento.)

    
por Alexis Huxley 05.03.2017 / 16:27

1 resposta

4

Trechos do changelog do bash:

This document details the changes between this version, bash-4.4-alpha, and the previous version, bash-4.3-release.

3. New Features in Bash

f. The -p option to declare and similar builtins will display attributes for named variables even when those variables have not been assigned values (which are technically unset).


This document details the changes between this version, bash-4.3-alpha, and the previous version, bash-4.2-release.

1. Changes to Bash

hhhh. Fixed a bug that caused declare and test to find variables that had been given attributes but not assigned values. Such variables are not set.

Observe que local é apenas um alias para declare , exceto que local erros quando não é chamado dentro de uma função.

Parece que ter typeset -p lista de variáveis não definidas foi considerado um bug, mas o comportamento foi revertido porque ter declare -p listar tais variáveis é " um pedido comum o suficiente ".

    
por 06.03.2017 / 02:58

Tags