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?

EmmaV
la source

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.

Gilles 'SO- arrête d'être méchant'
la source