bash silenciosamente retorna a função (re) declare da matriz global de leitura associativa somente leitura

3

Obviamente, recorte de um script muito mais complexo que tenha sido mais significativo:

#!/bin/bash

function InitializeConfig(){
    declare -r -g -A SHCFG_INIT=( [a]=b )
    declare -r -g -A SHCFG_INIT=( [c]=d )
    echo "This statement never gets executed"
}

set -o xtrace

InitializeConfig
echo "Back from function"

A saída é assim:

ronburk@ubuntu:~/ubucfg$ bash bug.sh
+ InitializeConfig
+ SHCFG_INIT=([a]=b)
+ declare -r -g -A SHCFG_INIT
+ SHCFG_INIT=([c]=d)
+ echo 'Back from function'
Back from function

O Bash parece executar silenciosamente um retorno de função na segunda instrução declare . Começando a pensar que este é realmente um novo bug, mas feliz em aprender o contrário.

Outros detalhes:

Machine: x86_64
OS: linux-gnu
Compiler: gcc
Compilation CFLAGS:  -DPROGRAM='bash' -DCONF_HOSTTYPE='x86_64' -DCONF_OSTYPE='linux-gnu' -DCONF_MACHTYPE='x86_64-pc-linux-gn$
uname output: Linux ubuntu 3.16.0-38-generic #52~14.04.1-Ubuntu SMP Fri May 8 09:43:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Lin$
Machine Type: x86_64-pc-linux-gnu

Bash Version: 4.3
Patch Level: 11
Release Status: release
    
por Ron Burk 14.06.2015 / 09:05

1 resposta

1

Encontrei este tópico no [email protected] relacionado a test -v em uma matriz assoc. Em suma, bash implicitamente fez test -v SHCFG_INIT[0] em seu script. Não tenho certeza se esse comportamento foi introduzido em 4.3.

Você pode querer usar declare -p para solucionar isso ...

if ! declare -p SHCFG_INIT >/dev/null 2>&1; then
    echo "looks like SHCFG_INIT not defined"
    
por 14.06.2015 / 11:18