Linux 系统中, LANG 和 LC_ALL变量有什么区别与联系?
在 Linux(以及其他类 Unix 系统)里,LANG
和 LC_ALL
都属于 locale(本地化环境) 相关的环境变量,用于控制系统的语言、字符编码、日期格式、货币符号、排序规则等。
它们的作用既有联系又有区别,核心差别在于 优先级和覆盖范围。
1. 关系
都是 locale 环境变量,影响程序的本地化行为。
变量的优先级顺序决定了哪个生效:
LC_ALL > LC_* > LANG
其中:
LC_ALL 优先级最高,会强制覆盖所有
LC_*
和LANG
的设置。LC_*(如 LC_TIME、LC_NUMERIC、LC_MESSAGES 等) 用于单独控制某一类本地化属性。
LANG 是默认的全局语言设置,当
LC_*
或LC_ALL
没有设置时才会生效。
2. 区别
变量 | 作用范围 | 优先级 | 常见用途 |
---|---|---|---|
LANG | 设置系统默认的语言和编码(所有 locale 类别的默认值) | 最低 | 定义全局默认语言,比如 LANG=en_US.UTF-8 |
LC_ALL | 强制覆盖所有 locale 设置(包括 LANG 和 LC_* ) | 最高 | 临时确保统一 locale(调试、避免格式化问题) |
3. 示例
假设当前系统设置如下:
LANG=zh_CN.UTF-8 LC_TIME=en_US.UTF-8 LC_ALL=
日期显示(
LC_TIME
控制)会是英语格式,因为它覆盖了LANG
。其他(如消息、货币格式)仍使用中文格式,因为没被单独覆盖。
如果执行:
export LC_ALL=en_US.UTF-8
所有本地化类别 都变成
en_US.UTF-8
,包括日期、货币、消息等。这时
LANG
和LC_*
的值都会被忽略。
4. 常用查看和修改方法
查看当前 locale 设置:
locale
临时修改(只影响当前 shell 会话):
export LANG=en_US.UTF-8 export LC_ALL=C
永久修改(影响所有用户/重启后生效):
编辑
/etc/locale.conf
(systemd 系统)或在
~/.bashrc
、~/.zshrc
中添加export LANG=...
✅ 总结
LANG
= 全局默认语言设置。LC_ALL
= 最高优先级,强制覆盖一切 locale 设置。一般情况下只设
LANG
和需要的LC_*
,不要在长期配置里设LC_ALL
,因为它会屏蔽细粒度的 locale 调整,通常只在调试或脚本中临时用。