В Bash гарантированы ли расширения подстановочного знака в порядке?
Гарантируется ли расширение подстановочного знака в Bash в алфавитном порядке? Я вынужден разбить большой файл на 10 Мбайт, чтобы они могли быть приняты моим репозиторием Mercurial.
Поэтому я подумал, что мог бы использовать:
split -b 10485760 Big.file BigFilePiece.
а затем вместо:
cat BigFile | bigFileProcessor
Я мог бы сделать:
cat BigFilePiece.* | bigFileProcessor
на своем месте.
Тем не менее, я не мог найти нигде, что гарантировано, что расширение звездочки (ака подстановочный знак, ака *
) всегда будет в алфавитном порядке, чтобы .aa
пришел раньше .ab
(в отличие от порядка временных меток или чего-то в этом роде).
Кроме того, есть ли недостатки в моем плане? Насколько велика стоимость исполнения cat
вместе файл?
3 ответа
Да, расширение globbing является алфавитным.
Из Баш man
страница:
Расширение пути
После разделения слов, если только
-f
опция установлена, bash сканирует каждое слово на наличие символов*
,?
, а также[
, Если появляется один из этих символов, слово считается шаблоном и заменяется отсортированным по алфавиту списком имен файлов, соответствующих шаблону.
Это документированное поведение для bash
так что вы можете зависеть от этого в своих сценариях. Это также верно в отношении других совместимых с Bourne оболочек в течение очень долгого времени... хотя могут быть угловые случаи, касающиеся свертывания регистра или не алфавитно-цифровых символов.
(Полученный список, в bash
будет в почти "ASCII-бетическом" порядке - за исключением того, что буквы в нижнем и верхнем регистре будут сопоставляться вместе, как если бы не было различий в регистре, но с разбором в нижнем регистре до их эквивалентов в верхнем регистре. Все неалфавитные выражения должны сопоставляться в том же порядке, в котором они указаны в ASCII).
Как уже отмечали другие, это может быть нарушено настройками вашей языковой среды: LANG в целом и LC_COLLATE более конкретно. Может быть безопаснее всего запускать команды, которые зависят от порядка расширения глобуса под env
Команда очистить окружающую среду (используя -i
или же -u
при необходимости) или передать результаты через sort
обеспечить надежную последовательность.
В то время как расширения глобуса сортируются в алфавитном порядке, они также подчиняются настройке языка оболочки.
Убедитесь, что в вашем скрипте установлено значение "C", если вы хотите, чтобы это было переносимо.