当变量未设置时,我一直在使用间接扩展并依赖结果为空字符串:
$ $SHELL --version | head -1
GNU bash, version 4.4.23(1)-release (x86_64-unknown-linux-gnu)
$ unset var
$ echo "${!var}"
$
但是在一个失败的新Linux机器上invalid indirect expansion
:
$ $SHELL --version | head -1
GNU bash, version 5.0.7(1)-release (x86_64-pc-linux-gnu)
$ unset var
$ echo "${!var}"
-bash: var: invalid indirect expansion
$
显然,我可以更改我的代码以在两个地方都工作,但到目前为止,我还无法弄清楚导致 1 失败但另一个失败的 2 个系统之间的确切区别,我想知道这种区别是什么最好解决这个问题以及将来出现的任何类似问题。
如果只是 bash 版本的变化,我找不到任何发行说明或任何表明这一点的东西。如果在一个选项上设置了某个选项,我也找不到(set -u
例如不是)。FWIW 这shopt
是发生故障的机器(第二列)和未发生故障的机器(第三列)之间的输出差异:
$ awk 'FNR==1{ARGIND++} {a[$1,ARGIND]=$2; b[$1]} END{for (var in b) if (a[var,1] != a[var,2]) print var, a[var,1], a[var,2]}' bad good | column -t
autocd off
compat32 off
localvar_unset off
lastpipe off
localvar_inherit off
complete_fullquote on
assoc_expand_once off
checkwinsize on off
globasciiranges on
compat40 off
compat41 off
compat42 off
inherit_errexit off
compat43 off
compat44 off
checkjobs off
expand_aliases on off
globstar off
progcomp_alias off
dirspell off
direxpand off
login_shell on off
任何人都确切地知道为什么我在一个 Unix 机器上看到失败,而在另一个机器上却没有?
它已针对 5.0-alpha 进行了更改,
CHANGES
Bash 源中的文件具有以下条目:这是作者在邮件列表中的一篇关于此的帖子:https ://lists.gnu.org/archive/html/bug-bash/2016-11/msg00165.html
确实在 Bash 4.4 中出现空值错误的情况: