Linux 如何在shell中使用花括号(bash)

Linux 如何在shell中使用花括号(bash),linux,bash,shell,glob,brace-expansion,Linux,Bash,Shell,Glob,Brace Expansion,我目前正试图重现基本的外壳行为,更具体地说,是全球化行为。 我在测试带有花括号的命令,发现这种行为我不理解。 首先,我正在使用的目录的内容如下: 1abc 2abc 3abc abc1 abc2 abc3 然后,我键入以下命令:ls{[1-3],[a-c]}*,它按预期返回了上面的所有文件 最后,我尝试了这个命令:ls{{,[1-3]},[a-c]}*,正如您所看到的,它有重叠的花括号。现在我不明白的是这个命令的返回,因为它给了我这个:1abc 1abc 2abc 2abc 3abc 3abc

我目前正试图重现基本的外壳行为,更具体地说,是全球化行为。 我在测试带有花括号的命令,发现这种行为我不理解。 首先,我正在使用的目录的内容如下:

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是如何解释这一点的

我希望我的解释清楚。

Bash

{{,[1-3]},[a-c]}*
在第一步(支架展开)中


在第二步(globbing)中,bash将
*
扩展到所有文件
[1-3]*
扩展到以
1
开头的所有文件、
2
3
并将
[a-c]*
扩展到以
a
b
c
字符串
<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

好的,非常感谢你的解释,它真的很清楚,我现在明白了!
$ ls {{,[1-3]},[a-c]}*
1abc  1abc  2abc  2abc  3abc  3abc  abc1  abc1  abc2  abc2  abc3  abc3