Чи впевнені, що в Баші розширення підстановок буде в порядку?


53

Чи гарантується розширення підстановки в Bash в алфавітному порядку? Я змушений розділити великий файл на шматки 10 Мб, щоб їх можна було прийняти в моєму сховищі Mercurial.

Тому я думав, що можу використовувати:

split -b 10485760 Big.file BigFilePiece.

а потім замість:

cat BigFile | bigFileProcessor

Я міг би зробити:

cat BigFilePiece.* | bigFileProcessor

на своєму місці.

Однак я не міг ніде знайти, що гарантувало б, що розширення зірочки (ака-мак, інакше *) завжди буде в алфавітному порядку, щоб це .aaбуло раніше .ab(на відміну від замовлення часових міток чи чогось подібного).

Також, чи є в моєму плані якісь недоліки? Наскільки велика вартість продуктивності catфайлу разом?


4
Напевно, ви неправильно підходите. Якщо адміністратор поставив обмеження на розмір файлів, які ви маєте у сховищі, то вам слід поговорити з ним. Якщо говорити про розширення - я завжди бачив, що розширення буквено-цифрове.
Мірча Вутковичі

1
Ви завжди можете пройти через sortбудь-яку додаткову маніпуляцію з замовленням.
Warner

2
Зверніть увагу, що Mercurial може керувати файлами будь-якого розміру, обмеженим обсягом оперативної пам’яті. Якщо ви додасте великий файл, ви отримаєте попередження, оскільки Mercurial передбачає, що він може зберігати файл у пам'яті. Для злиття Mercurial потрібно зберігати два файли в пам'яті. Отже, машини з невеликою кількістю оперативної пам’яті можуть мати проблеми з перевіркою файлу. Я просто тестував це, і hg commitна NMB-файл потрібно близько 3 * NМБ оперативної пам’яті і hg updateпотрібно близько 2 * NМБ оперативної пам’яті. Це з Mercurial 1.5 в Linux.
Мартін Гейслер

Відповіді:


67

Так, глобальне розширення є алфавітним.

На manсторінці Bash :

Розширення шляху

Після слів розщеплення, якщо -fпараметр не встановлено, Баш сканує кожне слово для символів *, ?і [. Якщо з’являється один із цих символів, то слово вважається візерунком і замінюється алфавітно відсортованим списком імен файлів, що відповідають шаблону.


@ Деніс Вільямсон, будь-яка ідея, чи все-таки це було б правдою, якщо користувач має інший набір мови?
Зоредаче

5
@Zoredache: Це фактично вказано POSIX: opengroup.org/onlinepubs/007908775/xsh/glob.html "Назви шляхів у порядку сортування, як визначено поточним налаштуванням категорії LC_COLLATE, див. Специфікацію XBD, LC_COLLATE [ opengroup.org / onlinepubs / 007908775 / xbd /… ", і саме тому ви повинні робити такі речі, як ls -l [[:lower:]]замість ls -l [a-z].
Денніс Вільямсон

Зауважте, що замовлення в алфавітному порядку, тому BigFilePiece.10 надійде до BigFilePiece.2
Кен

@DennisWilliamson - Чому дві пари квадратних дужок? Одне, здається, працює точно так само і для мене.
ArtOfWarfare

2
@ArtOfWarfare: Спробуйте це: mkdir lctest; cd lctest; touch w; touch z; ls -l [:lower:]; echo =====; ls -l [[:lower:]]. Файл "z" перелічується лише другим, lsтому що він вимагає вживати однолітерні назви з малої літери. Перший ls- той, що не має зовнішніх квадратних дужок, - запитує назви односимвольних файлів із списку символів ":", "l", "o", "w", "e" та "r". В обох випадках найбільш зовнішні квадратні дужки розмежовують дужковий вираз, у якому перераховані символи та класи. У випадку з [[:lower:]]внутрішніми квадратними дужками, двокрапками та словом називають клас символів. ...
Денніс Вільямсон

4

Це документоване поведінка, bashтому ви можете залежати від цього у своїх сценаріях. Також це стосується інших сумісних оболонок Борна дуже давно ... хоча можуть бути кутові випадки, що стосуються складання справ або не буквено-цифрових символів.

(Отриманий список, в, bashбуде майже в "ASCII-betical" порядку --- за винятком того, що літери нижнього та верхнього регістру будуть зібрані разом, як ніби різниці у регістрі немає, але з нижнього регістру, зібраного перед їх верхніми величинами великого регістру. Усі не -алфабетики повинні узгоджуватися в тому ж порядку, що і в ASCII).

Як зазначають інші, це може бути обурене вашими налаштуваннями середовища, пов'язаними з мовою: LANG загалом і LC_COLLATE, а конкретніше. Можливо, найбезпечніше запускати команди, які залежать від впорядкування глобального розширення в envкоманді для очищення середовища (використовуючи -iабо -uза необхідності) або передавати результати, sortщоб забезпечити надійну послідовність.


4
Схоже, що всі алфавітно-цифрові ігноруються в процесі сортування. Тож "=", "_", "~" не можна використовувати для примушування файлу до початку або закінчення (відповідно) списку.
Отей

3

У той час як глобальні розширення сортуються в алфавітному порядку, вони також підкоряються налаштуванню багажу оболонки.

Не забудьте встановити це значення "C" у вашому сценарії, якщо ви плануєте це як портативний.

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