如何更改区域设置环境变量?


18

我已经生成了en_US.utf8et_EE.iso88591ru_RU.utf8本地化文件。现在,如果我尝试将任何语言环境变量更改为ru_RU.utf8en_US.utf8,那么这将没有任何效果:

# locale -a
C
en_US.utf8
et_EE
et_EE.iso88591
POSIX
ru_RU.utf8
# LC_TIME=ru_RU.utf8
# locale | grep LC_TIME
LC_TIME="et_EE.iso88591"
# LC_TIME="ru_RU.utf8"
# locale | grep LC_TIME
LC_TIME="et_EE.iso88591"
# 

但是,如果我更改LANG =变量,则除LANGUAGE =LC_ALL =之外的所有其他变量都采用LANG =的值变量的值。有没有办法分别修改每个区域设置变量?另外,我是否纠正了语言环境变量不是常规shell变量,而更像是语言环境实用程序的参数的问题?

Answers:


15

您可以独立设置任何语言环境类别。LANG仅适用于未明确设置的类别。

LANGLC_xxx在普通的环境变量。它们不是用于locale实用程序的:该locale程序不参与任何语言环境处理,它只是一个小的实用程序,用于报告当前和可用的语言环境设置。

当您编写时LC_TIME=ru_RU.utf8,这不会设置环境变量,而只会设置shell变量。Shell变量在Shell内部,其他程序看不到。另一方面,环境变量由Shell启动的程序继承。您还需要将变量导出到环境中:

$ LC_TIME=ru_RU.utf8
$ locale | grep LC_TIME
LC_TIME="et_EE.iso88591"
$ export LC_TIME
$ locale | grep LC_TIME
LC_TIME="ru_RU.utf8"

或直接

$ export LC_TIME=ru_RU.utf8
$ locale | grep LC_TIME
LC_TIME="ru_RU.utf8"

“郎和LC_xxx都是普通环境变量”你怎么知道是LANGLC_xxx是环境变量?我的测试表明,只有LANGand LANGUAGELC_MESSAGESand LC_ALL是环境变量,而其他变量如LC_CTYPEand LC_MONETARY不是环境变量(同样,它们不是shell变量)?
rony_t

@rony_t您可以查看应用程序和库的源代码,查看它们的文档或进行试验。例如,env LC_TIME=en_GB date使用env LC_TIME=fr_FR date和进行兼容env PATH="$PATH" date(显然,选择系统上存在的语言环境)。显然,每个变量可能会或可能不会在给定进程的环境中设置。你做了什么测试?您确定所使用的应用程序的行为基于LC_CTYPE(相当普遍)和LC_MONETARY(非常罕见)是否有所不同?
吉尔斯(Gilles)'所以

在终端中,我执行了printenv命令以列出bash的环境变量,并且只有LANGand LANGUAGELC_MESSAGESand LC_ALL被列为环境变量。我还执行了该命令,set -o posix然后执行了该命令,set以获取bash的环境变量和shell变量,并且仅列出LANGand LANGUAGELC_MESSAGESand LC_ALL。因此,这意味着 LANGand LANGUAGELC_MESSAGESand LC_ALL是环境变量,其余的语言环境变量不是,也不是shell变量。
rony_t

@rony_t号这意味着已经设置环境变量LANGLANGUAGELC_MESSAGESLC_ALL。(您可以明确地执行此操作,也可以由您的发行版或系统管理员来执行。)您可以使用任何(在语法上有效的)名称来设置环境变量!但是有些名称对某些应用程序有意义,而有些名称则没有意义。LC_MESSAGESLC_CTYPELC_TIME等是由关心的错误消息的语言,字符编码,时间格式应用,等等。
吉尔斯(Gilles)'所以

@rony_t顺便说一下,您的配置很奇怪。的设置LC_ALL会覆盖所有其他设置,因此其他区域设置变量的值无关紧要。通常,它只是临时用来强制程序使用给定的语言环境,在正常环境中使用它没有任何意义。
吉尔斯(Gilles)'所以

6

我相信在基于Fedora / CentOS / RHEL的发行版下,您可以locale -a在此系统文件中运行命令时将语言环境更改为显示的语言环境之一:

/etc/sysconfig/i18n

例如在我的Fedora 14系统上:

$ more /etc/sysconfig/i18n 
LANG="en_US.UTF-8"
SYSFONT="latarcyrheb-sun16"

在GNOME下,您可以运行帮助应用程序:

system-config-language

弹出这个GUI:

             ss的lang。 GUI

我认为Debian / Ubuntu发行版略有不同。我相信是这个文件:

/etc/default/locale

我相信它们是环境变量,但不能完全确定应用程序如何利用它们。

参考文献


4

至少在RedHat 6上,请注意,如果设置了LC_ALL,则设置其他LC_ *环境变量将无效,因为LC_ALL优先于所有其他LC_ *环境变量。

[root@nbu76 bin]# LC_TIME=en_US.UTF-8
[root@nbu76 bin]# export LC_TIME
[root@nbu76 bin]# locale
LANG=en_US.UTF-8
LC_CTYPE="en_IE"
LC_NUMERIC="en_IE"
LC_TIME="en_IE"
...
LC_ALL=en_IE
[root@nbu76 bin]# unset LC_ALL
[root@nbu76 bin]# locale
LANG=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
LC_NUMERIC="en_US.UTF-8"
LC_TIME=en_US.UTF-8
...
LC_ALL=
[root@nbu76 bin]# export LC_TIME=en_IE
[root@nbu76 bin]# locale
LANG=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
LC_NUMERIC="en_US.UTF-8"
LC_TIME=en_IE
....
LC_ALL=

1

在Debian系统中,可以运行dpkg-reconfigure locales以设置主要语言并使其他语言可用。然后可以运行update-locale以将LANGUAGE环境变量设置/etc/default/locale为具有后备语言。


2
dpkg-reconfigure locales,不是locale
lauriys
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.