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