Чому ехо збігається з деякими файлами двічі?


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

Я не розумію, чому це відбувається. Скажіть, будь ласка, хтось?

Відповіді:


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.

¹ Далі останнє, якщо ви дотримуєтесь опису посібника, але "вилучення цитат" насправді не є річчю - цитати аналізуються раніше, ніж процес розширення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.