显然,删除了一个更复杂、更有意义的脚本:
#!/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 似乎在第二条语句上默默地执行函数返回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
。简而言之,bashtest -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"