macos - OS X 上的 Bash 区域设置敏感通配符

标签 macos bash locale

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/

相关文章:

linux - 设置文件夹 A 和 B 的差异,即 |A-B| = C

javascript - JavaScript 如何/在哪里检测默认语言环境?

java - 调查有关 String.valueOf(float) 的 Java 错误

objective-c - 以编程方式将应用程序的内容复制到桌面

macos - "npm install -g <package>"安装包在哪里?

macos - 点网 : command not found in Mac

swift + Xcode : use osascript in Mac App

Python 无法正确运行 shell 命令

bash - 使用 bash 脚本中的参数运行 R 文件

java - Locale.getDefault() 为 Currency.getInstance 返回不受支持/无效的区域设置