¿Por qué echo hace coincidir algunos archivos dos veces?


11
$ 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

No entiendo por qué está sucediendo esto. Por favor alguien puede explicar?

Respuestas:


21

Las llaves no son patrones comodín. Verifique la documentación de las expansiones de bash : las llaves se expanden muy temprano en el proceso y los patrones comodín se expanden en el último paso¹.

Inicialmente, el comando se compone de dos palabras echo, *{1..12}. Después de la expansión de llaves, el comando contiene 13 palabras: echo, *1, *2, ..., *12. Luego se expanden los patrones comodín. *1se expande a la lista de nombres de archivo que terminan en 1, que incluye no solo file1sino también file11(que se ordena luego en orden lexicográfico). Del mismo modo se *2expande a file12y file2(en este orden). Para que pueda obtener echo, file1, file11, file12, file2, y luego los otros comodines que coincidió con un solo archivo: file3, file4, ..., file12.

¹ Al final, si sigue la descripción del manual, pero "eliminar citas" no es realmente una cosa: las citas se analizan antes que el proceso de expansión.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.