Почему echo сопоставляет некоторые файлы дважды?

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

Я не понимаю, почему это происходит. Пожалуйста, кто-нибудь может объяснить?

EmmaV
источник

Ответы:

21

Брекеты не являются шаблонами подстановочных знаков. Проверьте документацию расширений bash : фигурные скобки раскрываются очень рано, а шаблоны подстановочных знаков раскрываются на последнем шаге¹.

Первоначально команда состоит из двух слов echo, *{1..12}. После расширения распорки, команда состоит из 13 слов: echo, *1, *2, ..., *12. Затем шаблоны подстановочных знаков расширяются. *1расширяется до списка имен файлов, оканчивающихся на 1, который включает в себя не только, file1но и file11(который затем сортируется в лексикографическом порядке). Аналогично *2расширяется до file12и file2(в этом порядке). Таким образом , вы получите echo, file1, file11, file12, file2, а затем другие специальные символы , которые соответствуют один файл: file3, file4, ..., file12.

¹ Рядом с последним, если вы следуете описанию руководства, но «удаление кавычек» на самом деле не вещь - кавычки анализируются раньше, чем процесс расширения.

Жиль "ТАК - перестань быть злым"
источник