Nullglob 中断数组声明打印
Nullglob breaks array declaration printing
在 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
的声明。
问题不在于 nullglob
而不是引用 echo
命令。
如果你引用它,那么它应该可以正常工作:
shopt -s nullglob
echo "$(test)"
declare -- FOO="xyz"
declare -a BAR='([0]="one" [1]="two" [2]="three")'
没有引用 shell 试图扩展 test
函数的输出,因为输出中有很多 glob 字符。
当设置 nullglob
时,扩展失败并且不会为失败的 glob 表达式打印任何内容。
通过不引用 echo $(test)
然后 $(test)
部分进行路径名扩展。 declare -p
的结果包含 []
个根据文件系统检查的字符。当设置了 nullglob 并且没有匹配的文件时,则删除该词。
尝试设置 shopt -s failglob
以更详细地查看发生了什么;缺少匹配的文件会导致错误。
在 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
的声明。
问题不在于 nullglob
而不是引用 echo
命令。
如果你引用它,那么它应该可以正常工作:
shopt -s nullglob
echo "$(test)"
declare -- FOO="xyz"
declare -a BAR='([0]="one" [1]="two" [2]="three")'
没有引用 shell 试图扩展 test
函数的输出,因为输出中有很多 glob 字符。
当设置 nullglob
时,扩展失败并且不会为失败的 glob 表达式打印任何内容。
通过不引用 echo $(test)
然后 $(test)
部分进行路径名扩展。 declare -p
的结果包含 []
个根据文件系统检查的字符。当设置了 nullglob 并且没有匹配的文件时,则删除该词。
尝试设置 shopt -s failglob
以更详细地查看发生了什么;缺少匹配的文件会导致错误。