Bash Globbing not as expected

Существует до четырех соглашений об использовании параметров командной строки unix:

  1. -o -p -t (тире перед каждым параметром)
  2. -opt (тире перед набором параметров)
  3. opt (без тире перед набором параметров)
  4. - long-option (двойное тире перед именем параметра)

Например:

$ tar -x -v -z -f package.tar.gz
$ tar -xvzf package.tar.gz
$ tar xvzf package.tar.gz
$ tar --extract --verbose --gzip --file package.tar.gz
8
19.01.2017, 03:14
1 ответ

Это проблема локали . В вашем регионе [AZ] заменяется на что-то вроде [AbBcZ ... zZ] (плюс, возможно, другие символы с диакритическими знаками), поэтому [^ AZ] фактически означает «файлы, которые заканчиваются на a » в вашем примере (и только в вашем примере).

Если вы хотите избежать такой неожиданности, один из способов - установить LC_COLLATE = C , поскольку сопоставление - это часть ваших языковых настроек, которая отвечает за порядок сортировки. Кроме того, пустой LC_ALL , если он установлен, так как он будет иметь приоритет.

$ ls [a-z]*[^A-Z]
aa  ha

$ ( LC_ALL=; LC_COLLATE=C; ls [a-z]*[^A-Z] )
a123e  aa  ah  ha  hh

Или, что лучше, лучше не менять настройки локали и использовать соответствующие классы: [: lower:] вместо [az] и [: верхний:] вместо [AZ] .

$ ls [[:lower:]]*[^[:upper:]]
a123e  aa  ah  ha  hh

Или используйте параметр globasciiranges в bash:

$ shopt -s globasciiranges
$ ls [a-z]*[^A-Z]
a123e  aa  ah  ha  hh

$ shopt -u globasciiranges
$ ls [a-z]*[^A-Z]
aa  ha
9
27.01.2020, 20:11

Теги

Похожие вопросы