为什么 Bash 不会因为扩展缺失的变量和“-u”标志而失败?

ris*_*en0 0 bash

我原以为这个 Bash 脚本会失败,但它却成功运行:

set -u
exec {FOO}>/tmp/foo.lock
echo "FOO=$FOO"
Run Code Online (Sandbox Code Playgroud)

也在 OnlineGDB 上: https: //onlinegdb.com/3gv34jmGr

我希望 Bash(5.0.3 以及 5.1.16)尝试扩展FOO到文件描述符并停止,因为它未定义并且-u已设置。它不仅运行该行,而且似乎设置 FOO为任意数字并完成脚本。标准输出是

FOO=10
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?它是已记录的 Bash 功能吗?我在哪里可以找到有关它的更多信息?为什么特别是数字10?

Kam*_*ski 6

手册中:

每个重定向前面可能带有文件描述符编号,但前面可能带有以下形式的单词{varname}>&-在这种情况下,对于除和 之外的每个重定向运算符<&-,shell 都会分配一个大于 10 的文件描述符并将其分配给{varname}

(显然应该是“大于或等于10”。)

exec {FOO}>/tmp/foo.lock包含一个作业。FOO不再是未定义的。