Как изменить локальную переменную среды?

18

Я создал файлы локализации en_US.utf8 , et_EE.iso88591 и ru_RU.utf8 . Теперь, если я попытаюсь изменить любую переменную локали на ru_RU.utf8 или en_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 = . Есть ли способ изменить каждую переменную локали отдельно? Кроме того, правильно ли я, что переменные локали не являются обычными переменными оболочки, а больше похожи на параметры утилиты локали ?

Мартин
источник

Ответы:

15

Вы можете установить любую категорию локали самостоятельно. LANGприменяется только к категориям, которые не установлены явно.

LANGи LC_xxxявляются обычными переменными среды. Они не являются настройками localeутилиты: localeпрограмма не участвует в какой-либо обработке локали, это просто небольшая утилита, которая сообщает о текущих и доступных настройках локали.

Когда вы пишете LC_TIME=ru_RU.utf8, это не устанавливает переменную окружения, а только переменную оболочки. Переменные оболочки являются внутренними для оболочки, они не видны другим программам. С другой стороны, переменные среды наследуются программами, запускаемыми оболочкой. Вам также необходимо экспортировать переменную в среду:

$ 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"
Жиль "ТАК - прекрати быть злым"
источник
«LANG и LC_xxx обычные переменные среды» Как вы знаете , что LANGи LC_xxxпеременные окружения? мое тестирование показывает, что только LANGи, LANGUAGEи LC_MESSAGESи LC_ALLявляются переменными среды, в то время как другие переменные любят LC_CTYPEи LC_MONETARYне являются переменными среды (также они не являются переменными оболочки)?
rony_t
@rony_t Вы можете посмотреть исходный код приложений и библиотек, посмотреть их документацию или поэкспериментировать с ними. Например, сравните env LC_TIME=en_GB dateс env LC_TIME=fr_FR dateи env PATH="$PATH" date(очевидно, выберите локали, которые существуют в вашей системе). Очевидно, что каждая переменная может или не может быть установлена ​​в среде данного процесса. Какое тестирование вы делали? Вы уверены, что приложение, которое вы использовали, ведет себя по-разному LC_CTYPE(довольно часто) и LC_MONETARY(довольно редко)?
Жиль "ТАК - перестань быть злым"
В терминале я выполнил printenvкоманду, чтобы вывести список переменных окружения bash, и только LANGи, LANGUAGEи LC_MESSAGESи LC_ALLбыли перечислены как переменные окружения. Я также выполнил команду, set -o posixа затем команду, setчтобы получить переменные окружения и переменные оболочки bash, и только LANGи LANGUAGEи, LC_MESSAGESи LC_ALLбыли перечислены. Таким образом, это означает, что LANGи, LANGUAGEи LC_MESSAGESи LC_ALLявляются переменными среды, а остальные переменные локали - нет, а также они не являются переменными оболочки.
rony_t
@rony_t Нет . Это означает , что вы установили переменные окружения LANG, LANGUAGE, LC_MESSAGESи LC_ALL. (Либо вы сделали это явно, либо ваш дистрибутив, либо ваш системный администратор сделал это за вас.) Вы можете установить переменную среды под любым (синтаксически допустимым) именем! Но некоторые имена имеют значение для некоторых приложений, а некоторые - нет. LC_MESSAGES, LC_CTYPE, LC_TIMEИ так далее используются приложениями , которые заботятся о языке сообщений об ошибках, кодировку символов, формат времени, и так далее.
Жиль "ТАК - перестань быть злым"
@rony_t Кстати, ваша конфигурация очень странная. Настройка LC_ALLпереопределяет все остальные настройки, поэтому значение других переменных локали не имеет значения. Обычно он используется только временно, чтобы заставить программу использовать данную локаль, нет смысла использовать ее в обычной среде.
Жиль "ТАК - перестань быть злым"
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

Который вызывает этот графический интерфейс:

             сс ланг.  графический интерфейс пользователя

Я думаю, что это немного по-другому для дистрибутивов Debian / Ubuntu. Я считаю, что это файл:

/etc/default/locale

Я считаю, что они являются переменными среды, но не совсем уверены, как приложения используют их, если вообще используют.

Ссылки

SLM
источник
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=
Kiwicmc
источник
1

В системах Debian можно dpkg-reconfigure localesустановить основной язык и сделать доступными другие языки; затем можно запустить, update-localeчтобы установить LANGUAGEпеременную среды, /etc/default/localeчтобы иметь запасные языки.

LFD
источник
2
dpkg-reconfigure locales, неlocale
lauriys