有两个因素:
- 您可能正在使用带有内置 echo 的外壳(并且没有通知外壳您正在更改语言环境)
LANG
不是检查的第一个环境变量。根据locale(7)
,LC_ALL
并且LC_CTYPE
将首先检查:
如果 setlocale(3) 的第二个参数是一个空字符串,“”,对于
默认语言环境,使用以下步骤确定:
1.如果存在非空环境变量LC_ALL,则取值
使用 LC_ALL。
2.如果环境变量与其中一个同名
上述类别存在且非空,其值用于
那个类别。
3.如果存在非空环境变量LANG,则值为
使用 LANG。
对于后者,请查看locale
命令的输出,其中列出了将使用的所有环境变量:
$ export LANG=ru_RU.KOI8-R
$ locale
LANG=ru_RU.KOI8-R
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8
只是改变LANG
不应该改变其他变量,但改变LC_ALL
通常会这样做。
$ export LC_ALL=ru_RU.KOI8-R
$ locale
LANG=ru_RU.KOI8-R
LANGUAGE=
LC_CTYPE="ru_RU.KOI8-R"
LC_NUMERIC="ru_RU.KOI8-R"
LC_TIME="ru_RU.KOI8-R"
LC_COLLATE="ru_RU.KOI8-R"
LC_MONETARY="ru_RU.KOI8-R"
LC_MESSAGES="ru_RU.KOI8-R"
LC_PAPER="ru_RU.KOI8-R"
LC_NAME="ru_RU.KOI8-R"
LC_ADDRESS="ru_RU.KOI8-R"
LC_TELEPHONE="ru_RU.KOI8-R"
LC_MEASUREMENT="ru_RU.KOI8-R"
LC_IDENTIFICATION="ru_RU.KOI8-R"
LC_ALL=ru_RU.KOI8-R