![为什么 Bash 不会因为扩展缺失的变量和“-u”标志而失败?](https://linux22.com/image/220084/%E4%B8%BA%E4%BB%80%E4%B9%88%20Bash%20%E4%B8%8D%E4%BC%9A%E5%9B%A0%E4%B8%BA%E6%89%A9%E5%B1%95%E7%BC%BA%E5%A4%B1%E7%9A%84%E5%8F%98%E9%87%8F%E5%92%8C%E2%80%9C-u%E2%80%9D%E6%A0%87%E5%BF%97%E8%80%8C%E5%A4%B1%E8%B4%A5%EF%BC%9F.png)
我原以为这个 Bash 脚本会失败,但它却成功运行:
set -u
exec {FOO}>/tmp/foo.lock
echo "FOO=$FOO"
也在 OnlineGDB 上:https://onlinegdb.com/3gv34jmGr
我希望 Bash(5.0.3 以及 5.1.16)尝试扩展FOO
到文件描述符并停止,因为它未定义并且-u
已设置。它不仅运行那条线,而且似乎放 FOO
到任意数字并完成脚本。标准输出是
FOO=10
这里发生了什么?它是已记录的 Bash 功能吗?我在哪里可以找到有关它的更多信息?为什么特别是数字10?
答案1
来自手动的:
每个重定向前面可能带有文件描述符编号,但前面可能带有以下形式的单词
{varname}
。在这种情况下,对于除>&-
和 之外的每个重定向运算符<&-
,shell 都会分配一个大于 10 的文件描述符并将其分配给{varname}
。
(显然应该是“大于或等于10”。)
您exec {FOO}>/tmp/foo.lock
包含一个作业。FOO
不再是未定义的。