1

在 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发出声明。

4

2 回答 2

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 表达式打印任何内容。

于 2016-10-07T21:28:10.657 回答
1

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

尝试设置shopt -s failglob以更详细地查看正在发生的事情;缺少匹配的文件会导致错误。

于 2016-10-07T21:35:24.337 回答