3.5.8节中的bash-5.0手册指出以下内容。
拆分单词后,除非已设置-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打印任何内容吗?
确实,经过更多研究后,事实证明此后在中进行了还原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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句