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ć?

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.