【发布时间】:2016-08-27 14:54:09
【问题描述】:
在 CentOS 5 主机(使用 bash 3.2.32)上,我们使用 Ruby (1.8.7) 来
ENV['AWS_foo-bar_ACCESS_KEY'] = xxxxx
然后,使用 bash,我们运行一个 shell 脚本:
BUCKET_NAME=$1
AWS_ACCESS_KEY_ID_VAR="AWS_${BUCKET_NAME}_ACCESS_KEY_ID"
AWS_ACCESS_KEY_ID="${!AWS_ACCESS_KEY_ID_VAR}"
export AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}
这在 CentOS 5 上运行良好。
但是,在 CentOS 6(使用 bash 4.1.2)上,我们得到了错误
-bash: export: `AWS_foo-bar_ACCESS_KEY_ID=xxxxx': not a valid identifier
我们的理解是这会失败,因为变量名中不允许有-。但是为什么这适用于 bash 3.2 而不是 bash 4.1?
【问题讨论】:
-
重要的不是操作系统版本,而是
bash的版本。 -
@Barmar 你能扩展一下吗? CentOS 5 机器正在运行 bash 3.2(我的 Mac 也是如此),而 CentOS 6 机器正在运行 bash 4.1。我在bash changelog 中没有看到任何表明在变量名称中放弃对
-的支持(或者如果这种行为原本不应该被允许,则修复错误)。 -
-从未被允许在变量名中使用。它用作参数扩展语法的一部分:${foo-bar}表示返回$foo的值,但如果未设置变量,则默认为"bar"。 -
我怀疑旧版本在做变量间接时没有检测到这个问题,修复了这个bug。
-
简短形式:永远不要依赖未定义的行为。