$ 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
扩展到file12
and file2
(按此顺序)。因此,您会得到echo
, file1
, file11
, file12
, file2
,然后是与单个文件匹配的其他通配符:file3
, file4
, ..., file12
。
最后,如果您遵循手册的描述,但“引用删除”并不是真正的事情 - 引号在扩展过程之前被解析。