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 以更详细地查看发生了什么;缺少匹配的文件会导致错误。