Linux(CentOS) 和 OS X(Yosemite) 上的场景:
$ touch A B C X Y Z a b c x y z
$ locale
LC_ALL=en_GB.UTF-8
在 OS X 上,我使用区分大小写的文件系统。
Linux 上的 Bash 4.1.2:
$ echo [A-Z]
A b B c C x X y Y z Z
这是预期的输出,遵循此语言环境的 LC_COLLATE
。
OS X 上的 Bash 4.3.39:
$ echo [A-Z]
A B C X Y Z
这似乎与区域设置 ANSI、C 或 POSIX 相同。因此,在 OS X 上,语言环境似乎被通配忽略了。
为什么不一致?有没有办法在 OS X 上获取区域设置敏感的结果?
编辑:
OS X:LC_ALL
在 .bash_profile
中显式设置,使用:
export LC_ALL=en_GB.UTF-8
OS X 上的区域设置:
bash-4.3$ locale
LANG="en_GB.UTF-8"
LC_COLLATE="en_GB.UTF-8"
LC_CTYPE="en_GB.UTF-8"
LC_MESSAGES="en_GB.UTF-8"
LC_MONETARY="en_GB.UTF-8"
LC_NUMERIC="en_GB.UTF-8"
LC_TIME="en_GB.UTF-8"
LC_ALL="en_GB.UTF-8"
Linux 上的语言环境:
$ locale
LANG=en_US.utf8
LC_CTYPE="en_GB.utf8"
LC_NUMERIC="en_GB.utf8"
LC_TIME="en_GB.utf8"
LC_COLLATE="en_GB.utf8"
LC_MONETARY="en_GB.utf8"
LC_MESSAGES="en_GB.utf8"
LC_PAPER="en_GB.utf8"
LC_NAME="en_GB.utf8"
LC_ADDRESS="en_GB.utf8"
LC_TELEPHONE="en_GB.utf8"
LC_MEASUREMENT="en_GB.utf8"
LC_IDENTIFICATION="en_GB.utf8"
LC_ALL=en_GB.utf8
编辑
文件系统的格式是 Mac OS 扩展(区分大小写,日志式)。
@chepner 建议我在 OS X 上没有单独的文件。这里有两件事, inode 不同,glob 构造 ?
给出了所有文件的大小写:
bash-4.3$ ls -li ?
559 -rw-r--r-- 1 clivedarke staff 0 Aug 4 17:23 A
560 -rw-r--r-- 1 clivedarke staff 0 Aug 4 17:23 B
561 -rw-r--r-- 1 clivedarke staff 0 Aug 4 17:23 C
562 -rw-r--r-- 1 clivedarke staff 0 Aug 4 17:23 X
563 -rw-r--r-- 1 clivedarke staff 0 Aug 4 17:23 Y
564 -rw-r--r-- 1 clivedarke staff 0 Aug 4 17:23 Z
565 -rw-r--r-- 1 clivedarke staff 0 Aug 4 17:23 a
566 -rw-r--r-- 1 clivedarke staff 0 Aug 4 17:23 b
567 -rw-r--r-- 1 clivedarke staff 0 Aug 4 17:23 c
568 -rw-r--r-- 1 clivedarke staff 0 Aug 4 17:23 x
569 -rw-r--r-- 1 clivedarke staff 0 Aug 4 17:23 y
570 -rw-r--r-- 1 clivedarke staff 0 Aug 4 17:23 z
另外:
bash-4.3$ echo 'lower' > a
bash-4.3$ echo 'upper' > A
bash-4.3$ cat a
lower
bash-4.3$ cat A
upper
bash-4.3$ diff a A
1c1
< lower
---
> upper
最佳答案
挖掘我在 bash-4.3/lib/glob/smatch.c
中找到的源代码以下评论:
/* We use strcoll(3) for range comparisons in bracket expressions,
even though it can have unwanted side effects in locales
other than POSIX or US. For instance, in the de locale, [A-Z] matches
all characters. If GLOB_ASCIIRANGE is non-zero, and we're not forcing
the use of strcoll (e.g., for explicit collating symbols), we use
straight ordering as if in the C locale. */
在 configure
我发现:
--enable-glob-asciiranges-default
force bracket range expressions in pattern matching
to use the C locale by default
所以我猜这是在编译时设置的。需要更多挖掘。
关于macos - OS X 上的 Bash 区域设置敏感通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31814605/