Wie ändere ich die Umgebungsvariable des Gebietsschemas?

18

Ich habe die Lokalisierungsdateien en_US.utf8 , et_EE.iso88591 und ru_RU.utf8 generiert . Wenn ich versuche, eine der Locale-Variablen in eine ru_RU.utf8 oder en_US.utf8 zu ändern , hat dies keine Auswirkung:

# 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"
# 

Wenn ich jedoch die Variable LANG = ändere , nehmen alle anderen Variablen außer LANGUAGE = und LC_ALL = den Wert der Variablen LANG = . Gibt es eine Möglichkeit, jede Gebietsschemavariable separat zu ändern? Stimmt es außerdem, dass Gebietsschemavariablen keine regulären Shell-Variablen sind, sondern eher Parameter für das Dienstprogramm locale darstellen ?

Martin
quelle

Antworten:

15

Sie können jede Gebietsschemakategorie unabhängig festlegen. LANGgilt nur für die Kategorien, die nicht explizit festgelegt sind.

LANGund LC_xxxsind gewöhnliche Umgebungsvariablen. Dies sind keine Einstellungen für das localeDienstprogramm: Das localeProgramm ist an keiner Gebietsschema-Verarbeitung beteiligt. Es ist nur ein kleines Dienstprogramm, mit dem aktuelle und verfügbare Gebietsschema-Einstellungen angezeigt werden.

Beim Schreiben LC_TIME=ru_RU.utf8wird keine Umgebungsvariable festgelegt, sondern nur eine Shell-Variable. Shell-Variablen sind in der Shell intern und werden von anderen Programmen nicht gesehen. Umgebungsvariablen hingegen werden von den Programmen geerbt, die die Shell startet. Sie müssen die Variable auch in die Umgebung exportieren:

$ 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"

oder direkt

$ export LC_TIME=ru_RU.utf8
$ locale | grep LC_TIME
LC_TIME="ru_RU.utf8"
Gilles 'SO - hör auf böse zu sein'
quelle
"LANG und LC_xxx sind normale Umgebungsvariablen" Woher wissen Sie das LANGund LC_xxxsind Umgebungsvariablen? Meine Tests zeigen, dass nur LANGund LANGUAGEund LC_MESSAGESund LC_ALLUmgebungsvariablen sind, während andere Variablen Umgebungsvariablen mögen LC_CTYPEund LC_MONETARYnicht sind (auch, sie sind keine Shell-Variablen)?
rony_t
@rony_t Sie können sich den Quellcode von Anwendungen und Bibliotheken ansehen, deren Dokumentation ansehen oder mit ihnen experimentieren. Beispiel: Kompatieren Sie env LC_TIME=en_GB datemit env LC_TIME=fr_FR dateund env PATH="$PATH" date(wählen Sie natürlich die auf Ihrem System vorhandenen Gebietsschemas aus). Offensichtlich kann jede Variable in der Umgebung eines bestimmten Prozesses festgelegt sein oder nicht. Welche Tests haben Sie durchgeführt? Sind Sie sicher, dass sich die von Ihnen verwendete Anwendung je nach LC_CTYPE(ziemlich häufig) und LC_MONETARY(ziemlich selten) anders verhält ?
Gilles 'SO- hör auf böse zu sein'
Im Terminal habe ich den printenvBefehl ausgeführt, um die Umgebungsvariablen von bash aufzulisten, und nur LANGund LANGUAGEund LC_MESSAGESund LC_ALLwurden als Umgebungsvariablen aufgeführt. Ich habe auch den Befehl set -o posixgefolgt von dem Befehl ausgeführt set, um die Umgebungsvariablen und die Shell-Variablen von bash abzurufen, und nur LANGund LANGUAGEund LC_MESSAGESund LC_ALLwurden aufgelistet. Das bedeutet also, dass LANGund LANGUAGEund LC_MESSAGESund LC_ALLUmgebungsvariablen sind und die übrigen Gebietsschemavariablen nicht und auch keine Shellvariablen.
rony_t
@rony_t Nein . Es bedeutet , dass Sie die Umgebungsvariablen festgelegt haben LANG, LANGUAGE, LC_MESSAGESund LC_ALL. (Entweder haben Sie dies explizit getan oder Ihre Distribution oder Ihr Systemadministrator haben es für Sie getan.) Sie können eine Umgebungsvariable mit einem beliebigen (syntaktisch gültigen) Namen festlegen! Einige Namen sind jedoch für eine bestimmte Anwendung von Bedeutung, andere nicht. LC_MESSAGES, LC_CTYPE, LC_TIMEUnd so weiter von Anwendungen verwendet , die über die Sprache der Fehlermeldungen kümmern, die Zeichencodierung, das Zeitformat, und so weiter.
Gilles 'SO- hör auf böse zu sein'
@rony_t Deine Konfiguration ist übrigens sehr seltsam. Die Einstellung von LC_ALLüberschreibt alle anderen Einstellungen, sodass der Wert der anderen Gebietsschemavariablen keine Rolle spielt. Es wird normalerweise nur vorübergehend verwendet, um ein Programm zur Verwendung eines bestimmten Gebietsschemas zu zwingen. Es macht keinen Sinn, es in Ihrer normalen Umgebung zu haben.
Gilles 'SO- hör auf böse zu sein'
6

Unter den Fedora / CentOS / RHEL-basierten Distributionen können Sie meines Erachtens die Ländereinstellung in eine der angezeigten Ländereinstellungen ändern, wenn Sie den locale -aBefehl in dieser Systemdatei ausführen :

/etc/sysconfig/i18n

Zum Beispiel auf meinem Fedora 14-System:

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

Unter GNOME können Sie die Hilfe-App ausführen:

system-config-language

Welche bringt diese GUI auf:

             ss von lang.  gui

Ich denke, dass es für die Debian / Ubuntu-Distributionen etwas anders ist. Ich glaube, es ist diese Datei:

/etc/default/locale

Ich glaube, sie sind Umgebungsvariablen, aber nicht ganz sicher, wie Anwendungen sie verwenden, wenn überhaupt.

Verweise

slm
quelle
4

Beachten Sie, dass mindestens in RedHat 6, wenn LC_ALL festgelegt ist, das Festlegen anderer LC_ * -Umgebungsvariablen keine Auswirkungen hat, da LC_ALL Vorrang vor allen anderen LC_ * -Umgebungsvariablen hat.

[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=
Kiwicmc
quelle
1

In Debian-Systemen kann dpkg-reconfigure localesman die Hauptsprache festlegen und andere zur Verfügung stellen. Dann kann man ausführen update-locale, um die LANGUAGEUmgebungsvariable /etc/default/localeauf Ersatzsprachen zu setzen.

lfd
quelle
2
dpkg-reconfigure locales, notlocale
lauriys