为什么 echo 会匹配某些文件两次?

为什么 echo 会匹配某些文件两次?
$ 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

我不明白为什么会发生这种情况。请问有人可以解释一下吗?

答案1

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

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

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

相关内容