Как сделать, чтобы глобальные классы символов bash учитывали регистр символов?

Я создал несколько файлов, таких как knob_A.png а также knob_a.png и моя подруга по Windows сказала, что это вызвало проблемы с ее приложением. Я решил назвать это knob_W.png вместо knob_a.png, Затем я сделал rsync до нашего общего сервера. Для того, чтобы навести порядок, я тогда сделал

rm knob_[a-d]*.png

и это убрано knob_A.png тоже. Это неправильно как футбольная бита.

ни shopt -s nocaseglob ни shopt -u nocaseglob заставляет его вести себя так, как я хочу.

Как мне сказать bash, чтобы его глобусы были чувствительны к регистру, как в старые времена?

2 ответа

Решение

Bash чувствителен к регистру. Проблема заключается в порядке сортировки символов в диапазоне. Из руководства Bash (info bash):

Порядок сортировки символов в выражениях диапазона определяется текущей локалью и значением переменной оболочки 'LC_COLLATE', если она установлена.

Например, в языковом стандарте C по умолчанию "[a-dx-z]" эквивалентно "[abcdxyz]". Многие локали сортируют символы в порядке словаря, и в этих локалях "[a-dx-z]" обычно не эквивалентно "[abcdxyz]"; например, это может быть эквивалентно '[aBbCcDdxXyYz]'. Чтобы получить традиционную интерпретацию диапазонов в выражениях в скобках, вы можете принудительно использовать языковой стандарт C, установив для переменной среды LC_COLLATE или LC_ALL значение "C".

Попробуй сделать

export LC_COLLATE=C

Bash имеет опцию оболочки для сохранения соответствия шаблону, поэтому регистр не игнорируется во время расширения. Можете добавить shopt -s globasciiranges к вашему сценарию, чтобы включить регистрозависимые совпадения и отключить его, используя shopt -u globasciiranges, Смотрите ссылку на Bash - Shopt Builtin

В качестве альтернативы вы можете использовать LC_COLLATE=C как указано в другом ответе, но убедитесь, что он был экспортирован в вашу среду с export LC_COLLATE

Другие вопросы по тегам