Dlaczego echo dopasowuje niektóre pliki dwukrotnie?

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

Nie rozumiem, dlaczego tak się dzieje. Czy ktoś może wyjaśnić?

EmmaV
źródło

Odpowiedzi:

21

Nawiasy klamrowe nie są wzorami wieloznacznymi. Sprawdź dokumentację rozszerzeń bash : nawiasy klamrowe są rozwijane na bardzo wczesnym etapie procesu, a wzorce symboli wieloznacznych są rozwijane w ostatnim kroku¹.

Początkowo komenda składa się z dwóch słów echo, *{1..12}. Po interpretacji nawiasów, polecenie zawiera 13 słów: echo, *1, *2, ..., *12. Następnie wzory symboli wieloznacznych są rozwijane. *1rozwija się do listy nazw plików kończących się na 1, która obejmuje nie tylko, file1ale także file11(która jest następnie sortowana w kolejności leksykograficznej). Podobnie *2rozwija się do file12i file2(w tej kolejności). Więc masz echo, file1, file11, file12, file2, a następnie pozostałe symbole wieloznaczne, które dopasowane pojedynczy plik: file3, file4, ..., file12.

¹ Poza tym , jeśli postępujesz zgodnie z opisem instrukcji, ale „usunięcie cytatu” nie jest tak naprawdę rzeczą - cytaty są analizowane wcześniej niż proces interpretacji.

Gilles „SO- przestań być zły”
źródło