Pourquoi l'écho correspond-il à certains fichiers deux fois?


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

Je ne comprends pas pourquoi cela se produit. S'il vous plaît quelqu'un peut-il expliquer?

Réponses:


21

Les accolades ne sont pas des motifs génériques. Consultez la documentation des extensions bash : les accolades sont développées très tôt dans le processus et les modèles génériques sont développés à la dernière étape¹.

Dans un premier temps , la commande se compose de deux mots echo, *{1..12}. Après le développement des accolades, la commande contient 13 mots: echo, *1, *2, ..., *12. Ensuite, les modèles génériques sont développés. *1s'étend à la liste des noms de fichiers se terminant par 1, qui comprend non seulement file1mais aussi file11(qui est ensuite trié dans l'ordre lexicographique). De même se *2dilate à file12et file2(dans cet ordre). Ainsi , vous obtenez echo, file1, file11, file12, file2, puis les autres jokers qui correspondent à un seul fichier: file3, file4, ..., file12.

¹ Avant-dernier, si vous suivez la description du manuel, mais la «suppression des devis» n'est pas vraiment une chose - les devis sont analysés plus tôt que le processus d'expansion.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.