Назад | Перейти на главную страницу

Гарантируется ли порядок подстановочных знаков в Bash?

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

Итак, я подумал, что могу использовать:

split -b 10485760 Big.file BigFilePiece.

а затем вместо:

cat BigFile | bigFileProcessor

Я мог бы сделать:

cat BigFilePiece.* | bigFileProcessor

на своем месте.

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

Кроме того, есть ли в моем плане недостатки? Насколько велика стоимость производительности catсобираете файл вместе?

Да, расширение подстановки происходит по алфавиту.

Из Баш man страница:

Расширение пути

После разделения слов, если -f установлена ​​опция, bash сканирует каждое слово на наличие символов *, ?, и [. Если появляется один из этих символов, то слово рассматривается как образец и заменяется отсортированным по алфавиту списком имен файлов, соответствующих этому образцу.

Это задокументированное поведение для bash так что вы можете положиться на него в своих сценариях. Это также верно в отношении других Bourne-совместимых оболочек в течение очень долгого времени ... хотя могут быть крайние случаи, касающиеся сворачивания регистра или не буквенно-цифровых символов.

(Результирующий список в bash будет в почти "ASCII-бетическом" порядке --- за исключением того, что буквы нижнего и верхнего регистра будут сопоставлены вместе, как если бы не было различий в регистре, но с сортировкой нижнего регистра до их эквивалентов в верхнем регистре. Все неалфавитные символы должны быть сопоставлены в том же порядке, в котором они представлены в ASCII).

Как отмечали другие, это может быть нарушено настройками среды, связанной с вашим языком: LANG в целом и LC_COLLATE в частности. Возможно, безопаснее всего запускать команды, которые зависят от порядка раскрытия глобуса под env команда для очистки среды (используя -i или -u в зависимости от ситуации) или передать результаты через sort для обеспечения надежной последовательности.

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

Убедитесь, что в вашем скрипте установлено значение «C», если вы собираетесь переносить его.