Bash 5 文件名扩展和 nullglob

Bash 5 文件名扩展和 nullglob

bash-5.0 手册第 3.5.8 节规定了以下内容。

分词后,除非设置了 -f 选项(请参阅内置设置),否则 Bash 会扫描每个单词中的字符 '*'、'?' 和 '['。如果出现这些字符之一,则该单词被视为一种模式,并替换为按字母顺序排序的与该模式匹配的文件名列表(请参阅模式匹配)。如果没有找到匹配的文件名,并且 shell 选项 nullglob 被禁用,则该单词将保持不变。如果设置了 nullglob 选项,并且没有找到匹配项,则该单词将被删除。

然而,在我的 shell 中,激活nullglob似乎在以下情况下也会启动文件名扩展。

$ echo ${BASH_VERSION}
5.0.0(1)-release
$ shopt -s nullglob
$ FOO="/home/smith"
$ echo ${FOO//\//\\\/}

$ echo "${FOO//\//\\\/}"
\/home\/smith

有趣的是,使用我可用的较旧的 bash 版本,会出现不同的行为。

$ echo ${BASH_VERSION}
4.3.30(1)-release
$ shopt -s nullglob
$ FOO="/home/smith"
$ echo ${FOO//\//\\\/}
\/home\/smith
$ echo "${FOO//\//\\\/}"
\/home\/smith

问题

我预计不会发生文件名扩展。你能解释一下为什么echo ${FOO//\//\\\/}bash 5.0 不打印任何内容吗?

答案1

事实上,经过更多研究后发现,这后来又被恢复了v5.1-alpha

$ echo ${BASH_VERSION}
5.1.0(1)-alpha
$ shopt -s nullglob
$ FOO="/home/smith"
$ echo ${FOO//\//\\\/}
\/home\/smith
$ echo "${FOO//\//\\\/}"
\/home\/smith

这是我个人所期待的。

这似乎也解决了不同的情况(感谢 Stéphane 指出):

$ echo ${BASH_VERSION}
5.1.0(1)-alpha
$ a='/\x' bash -O nullglob -c 'echo $a'
/\x

相关内容