问题描述
在 Linux 系统中,`LANG` 环境变量用于设置默认的语言和区域(locale)信息。设置 `LANG=c` 通常会将语言设置为 C locale(即 POSIX locale),这意味着系统会使用英语,并且字符集设置为 ASCII。所以,设置LANG=C之后,是不是理所应当就该回显英文了。然而,哐哐打脸。
现在回想起来,这也是一个“会者不难,难者不会”的问题。一开始,以为是Linux操作系统版本兼容性问题,跟现场再三确认,人家版本很新~~得~~
那大概率是其他环境变量跟LANG冲突了,并且比LANG优先级高。(公司本地的服务器,为了避免中文乱码,各种糟心事,一般我都喜欢设置成英文的,所以没环境确认~~算不算自己给自己挖了个坑)
让现场用户执行locale命令查看本地化参数,如下:
可以看到LC_ALL=zh_CN.UTF-8,一般情况下LC_ALL是空的(如下图),设置LANG会将其他的本地化语言变量一起修改掉。怀疑当LC_ALL有值的时候,LANG优先级低而失效。
验证过程
Linux下的环境变量可以设置在/etc/profile或 /etc/profile.d/*的文件(全局生效),也可以设置在~/.bash_profile(优先级高,只对当下用户有效)。
1、修改/etc/locale.conf ,设置LANG="en_US.UTF-8"
2、备份并修改~/.bash_profile,设置LC_ALL="zh_CN.UTF-8"
cp ~/.bash_profile{,_bak}
echo 'export LC_ALL="zh_CN.UTF-8"' >>~/.bash_profile
3、重新登录系统,执行locale命令
LANG=en_US.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=zh_CN.UTF-8
4、执行其他命令发现回显为“中文”,虽然LANG=en_US.UTF-8。