Nullglob打破了数组声明打印

时间:2016-10-07 21:21:47

标签: arrays bash glob

在GNU bash版本3.2.57上,我发现使用declare打印数组变量与nullglob选项之间存在冲突。

这两个在我看来是非常无关的,但启用nullglob时这是故意的吗?

#!/bin/bash

test () {
  local FOO="xyz"
  local BAR=("one" "two" "three")
  declare -p FOO
  declare -a -p BAR
}

echo $(test)
shopt -s nullglob
echo $(test)
shopt -u nullglob
echo $(test)

输出:

declare -- FOO="xyz" declare -a BAR='([0]="one" [1]="two" [2]="three")'
declare -- FOO="xyz" declare -a
declare -- FOO="xyz" declare -a BAR='([0]="one" [1]="two" [2]="three")'

注意在中间一行,设置nullglob时,不会发出BAR的声明。

2 个答案:

答案 0 :(得分:2)

问题不是nullglob,而是引用echo命令。

如果你引用它,它应该可以正常工作:

shopt -s nullglob
echo "$(test)"
declare -- FOO="xyz"
declare -a BAR='([0]="one" [1]="two" [2]="three")'

没有引用shell试图扩展test函数的输出,因为输出中有很多glob字符。

当设置nullglob时,扩展失败,并且没有打印任何表示失败的glob表达式。

答案 1 :(得分:1)

如果不引用echo $(test),那么$(test)部分将受路径名扩展的影响。 declare -p的结果包含[]个字符,这些字符将根据文件系统进行检查。如果设置了nullglob并且没有匹配的文件,则删除该单词。

尝试设置shopt -s failglob以更详细地了解发生的情况;缺少匹配的文件会导致错误。