bash는 전역 관련 읽기 전용 배열을 (재)선언할 때 자동으로 함수를 반환합니다.

bash는 전역 관련 읽기 전용 배열을 (재)선언할 때 자동으로 함수를 반환합니다.

분명히 더 복잡하고 의미 있는 스크립트가 제거되었습니다.

#!/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"

출력은 다음과 같습니다.

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

Bash는 두 번째 명령문에서 return 함수를 자동으로 수행하는 것 같습니다 declare. 이것이 실제로 새로운 오류라고 생각하기 시작했지만 그렇지 않은 경우를 알고 싶습니다.

그 외 세부 사항:

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

답변1

내가 찾은이 스레드는[이메일 보호됨]연관 배열과 관련됩니다 test -v. 간단히 말해서, bash는 test -v SHCFG_INIT[0]스크립트에서 이를 암시적으로 수행합니다. 이 동작이 4.3에서 도입되었는지 확실하지 않습니다.

declare -p이 문제를 해결하기 위해 이것을 사용하고 싶을 수도 있습니다 ...

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

관련 정보