大括号扩展对于少于 2 个参数不起作用

大括号扩展对于少于 2 个参数不起作用

我期望大括号扩展适用于任意数量的参数。然而,对于 n=1 我得到以下结果:

$ find models/nsf-projects-{7}*
models/nsf-projects-{7}.rdf

对于 n>1 扩展按预期发生,例如:

$ find models/nsf-projects-{6,7}*
find: ‘models/nsf-projects-6*’: No such file or directory
find: ‘models/nsf-projects-7*’: No such file or directory

我浏览了一下 GNU 手册,但没有发现在任何地方明确规定 >1 个参数的要求。

问:n>1 确实是大括号扩展的要求吗?如果是这样,为什么它有用?

答案1

是的,n > 1 是一个明确的要求:

格式正确的大括号扩展必须包含不带引号的左大括号和右大括号,以及至少一个不带引号的逗号或有效的序列表达式。任何错误形成的大括号扩展都保持不变。

至于为什么 - 在某种程度上是历史原因(尽管它是从csh原始版本复制的,它具有其他行为)。有些命令采用{}文字参数(find,parallel,以及其他具有更复杂参数的人),并且其他用途{}shell 语言中的。因为大括号扩展仅在按字面形式编写时(而不是从变量)进行处理,所以实际上没有动力支持退化扩展,并且有一些理由不支持。

答案2

man bash状态(强调):

正确形成的大括号扩展必须包含未加引号的左大括号和右大括号,并且至少有一个不带引号的逗号或有效的序列表达式。任何错误形成的大括号扩展都保持不变。

这也是本文的第五段支撑扩张bash 手册的部分。

我只能推测其动机,但我怀疑这是为了允许您键入包含的内容{...}而不会使大括号消失。 (仅举一个例子,这适用于正则表达式重复运算符。)

相关内容