我目前正在尝试重现基本的shell行为,更具体地说是浮动行为。 我正在用花括号测试命令,发现这种我不明白的行为。 首先,我正在使用的目录的内容如下:
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是如何解释它的。
我希望我的解释清楚。
答案 0 :(得分:2)
Bash扩展
{{,[1-3]},[a-c]}*
在第一步(支撑 - 扩展)到
* [1-3]* [a-c]*
在第二步(全球化)bash将*
扩展为所有文件和 [1-3]*
到以1
,2
或{开头的所有文件{1}} 和将3
扩展为以[a-c]*
,a
或b
开头的所有文件。
答案 1 :(得分:2)
字符串{{,[1-3]},[a-c]}*
是一个解释为brace expansion的表达式,由以下模式组成:
{,
),[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