为什么回声匹配某些文件两次?

Emm*_*maV 11 shell bash echo brace-expansion

$ touch file{1..12}

$ echo *e{1..12}
file1 file2 file3 file4 file5 file6 file7 file8 file9 file10 file11 file12

$ echo *{1..12}
file1 file11 file12 file2 file3 file4 file5 file6 file7 file8 file9 file10 file11 file12
Run Code Online (Sandbox Code Playgroud)

我不明白为什么会这样。请问有人可以解释一下吗?

Gil*_*il' 21

大括号不是通配符模式。检查bash 扩展文档:大括号在过程的早期扩展,通配符模式在最后一步扩展¹。

最初,该命令由两个单词echo, 组成*{1..12}。大括号展开后,该命令包含 13 个单词:echo, *1, *2, ..., *12。然后扩展通配符模式。*1扩展到以 结尾的文件名列表1,其中不仅包括file1而且还包括file11(之后按字典顺序排序)。同样*2扩展为file12file2(按此顺序)。所以你得到echo, file1, file11, file12, file2,然后是匹配单个文件的其他通配符:file3, file4, ..., file12

¹紧随其后,如果您遵循手册的描述,但“引用删除”并不是真正的事情 - 引用在扩展过程之前被解析。