在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
的声明。
答案 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
以更详细地了解发生的情况;缺少匹配的文件会导致错误。