macOS bash 通配引号变量意外 [重复]

macOS bash globbing quoted variable unexpectedly [duplicate]

提问人:Bill Wohler 提问时间:10/2/2023 更新时间:10/2/2023 访问量:39

问:

在装有 bash 5.2.15 的 Linux 上,单引号会阻止通配,如预期的那样:

$ dir='/path?/to?/file?'; echo $dir
/path?/to?/file?
$

但是,在带有 bash 3.2.57 的 macOS 上,我遇到了这种不良行为:

$ dir='/path?/to?/file?'; echo $dir

$

这种意外的通配似乎发生在 echo 命令中,因为变量设置正确:

$ set | grep ^dir
dir='/path?/to?/file?'

我猜这种无意的通配是 macOS 上古代 bash 版本中的一个错误。我尝试设置noglob无济于事。你能想出一个解决方法来获得上面的良好行为吗?

bash macOS 变量 glob 引用

评论

2赞 Charles Duffy 10/2/2023
您必须具有非默认配置才能实现此目的 - 默认情况下,与任何内容不匹配的 glob 会扩展到 glob 表达式本身。也就是说,这不一定与引用有关;它看起来更像是设置上的差异。nullglob
0赞 Charles Duffy 10/2/2023
请注意,如果要确保没有通配运行,则需要 ,而不是 。这在我刚刚分配了一个变量中有所介绍,但 echo $variable 显示了其他内容!由于要禁止显示的通配是在展开时执行的,而不是在赋值时执行的,因此赋值上的引号没有区别。echo "$dir"echo $dir
0赞 Charles Duffy 10/2/2023
顺便说一句,您可以使用打印当前的 nullglob 设置;如果输出,则表示已设置标志,如果输出,则表示未设置;您可以运行其中任何一个以强制其进入适当的(设置或未设置)状态。shopt -p nullglobshopt -s nullglobshopt -u nullglob
0赞 Gordon Davisson 10/2/2023
另请参阅“何时将 [双]引号括在 shell 变量周围?”(简短回答:几乎总是如此)。
0赞 user1934428 10/2/2023
在我的 Mac 上无法重现。对我来说,两个 bash 版本的行为都是一样的。确保您已以相同的方式配置它们;否则,您将将苹果与梨进行比较。

答:

0赞 Bill Wohler 10/2/2023 #1

在 echo 中引用变量有效:

$ dir=/path?/to?/file?; echo "$dir"
/path?/to?/file?

事实证明,设置变量时不需要引号。

这现在引出了一个问题,即为什么未加引号的回声在没有引号的情况下在 Linux 上工作。

评论

1赞 Charles Duffy 10/2/2023
难道我没有在对问题本身的评论中回答这个问题(旁白:提出而不是乞求)吗?(要使 glob 扩展为无,必须设置标志;默认情况下,没有匹配项的 glob 会扩展回 glob 表达式本身)。nullglob