Як змінити змінну локальної середовища?


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 Ви можете переглянути вихідний код програм і бібліотек, переглянути їх документацію або експериментувати з ними. Наприклад, compate 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

Що відображає цей графічний інтерфейс:

             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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.