3

我目前正在尝试重现基本的 shell 行为,更具体地说是 globbing 行为。我正在测试带有花括号的命令,发现这种行为我不明白。首先,我正在工作的目录的内容如下:

1abc 2abc 3abc abc1 abc2 abc3

然后,我输入了以下命令 : ls {[1-3],[a-c]}*,它按预期返回了上面的所有文件。

最后,我尝试了这个命令 : ls {{,[1-3]},[a-c]}*,正如你所看到的,它有叠瓦状的花括号。现在我不明白的是这个命令的返回,因为它给了我这个:1abc 1abc 2abc 2abc 3abc 3abc abc1 abc1 abc2 abc2 abc3 abc3

如您所见,所有文件都返回了两次,我无法弄清楚 shell 是如何解释这个的。

我希望我的解释很清楚。

4

2 回答 2

2

Bash 扩展

{{,[1-3]},[a-c]}*

在第一步(大括号扩展)中

* [1-3]* [a-c]*

在第二步(通配符)中,bash 扩展*到所有文件 [1-3]*所有以1, 2or开头的文件,3 扩展[a-c]*到所有以a, bor开头的文件c

于 2016-11-21T12:10:02.390 回答
2

该字符串{{,[1-3]},[a-c]}*是解释为大括号扩展的表达式,由以下模式组成:

  • “空虚”({,),
  • [1-3], 和
  • [a-c].

字符(意思是“给定目录中的*每个文件名”)适用于它们中的每一个:

*       => 1abc  2abc  3abc  abc1  abc2  abc3
[1-3]*  => 1abc  2abc  3abc
[a-c]*  => abc1  abc2  abc3

您嵌套了表达式这一事实并没有改变它只是三个模式列表的含义。可以使用更简单的表达式(例如{,[1-3],[a-c]}*)或另一个“列表列表”(例如 )来实现相同的效果{,{[1-3],[a-c]}}*

如果您将表达式传递给echo,它将一个接一个地打印以上行中的所有字符:

$ echo {{,[1-3]},[a-c]}*
1abc 2abc 3abc abc1 abc2 abc3 1abc 2abc 3abc abc1 abc2 abc3

ls默认情况下按字母顺序对条目进行排序:

$ ls {{,[1-3]},[a-c]}*
1abc  1abc  2abc  2abc  3abc  3abc  abc1  abc1  abc2  abc2  abc3  abc3
于 2016-11-21T12:14:14.630 回答