Объясните эффекты экспорта LANG, LC_CTYPE, LC_ALL

Я только что установил Linux Mint 17 и столкнулся с проблемой, что я не мог использовать русский язык в терминале. (Я вижу ? вместо букв). На одном форуме я нашел это решение:

Добавлено в ~/.profile:

export LANG=ru_RU.UTF-8
export LC_CTYPE=ru_RU.UTF-8
export LC_ALL=ru_RU.UTF-8

Это помогло, но и изменило мой язык интерфейса на русский (чего я не хотел). Это даже не проблема, но во всяком случае, я хотел бы знать, как работает этот код (каждая строка).

Спасибо.

Ответ 1

Я подробно объясню:

export LANG=ru_RU.UTF-8

Это команда оболочки, которая будет экспортировать переменную среды с именем LANG с заданным значением ru_RU.UTF-8. Это инструктирует интернационализированные программы использовать русский язык (ru), вариант из России (RU) и UTF-8 для вывода консоли.

Обычно этой единственной линии достаточно.

Это другое:

export LC_CTYPE=ru_RU.UTF-8

Есть аналогичная вещь, но она говорит программе не менять язык, а только CTYPE на русский. Если программа может изменить текст в верхний регистр, тогда он будет использовать российские правила для этого, даже если сам текст может быть на английском языке.

Стоит сказать, что смешивание LANG и LC_CTYPE может дать неожиданные результаты, потому что мало кто это делает, поэтому он довольно непроверен, если, может быть,

export LANG=ru_RU.UTF-8
export LC_CTYPE=C

Это сделает выпуск программы на русском языке, но стандартным старым стилем CTYPE.

Последняя строка, LC_ALL - последнее средство переопределения, которое заставит программу игнорировать все остальные переменные LC_* и использовать это. Я думаю, что вы никогда не должны писать его в строке профиля, но используйте его для запуска программы на определенном языке. Например, если вы хотите написать отчет об ошибке, и вам не нужен какой-либо локализованный вывод, и вы не знаете, какие переменные LC_* установлены:

LC_ALL=C program

Об изменении языка всех ваших программ или только консоли, зависит от того, где вы помещаете эти строки. Я поместил мой в ~/.bashrc чтобы они не применимы к графическому интерфейсу, только к консолям bash.

Ответ 2

См. Раздел Переменные среды на странице спецификации UNIX:

  • LANG Эта переменная определяет категорию локали для родного языка, локальных обычаев и кодированного символа, установленного в отсутствие LC_ALL и других LC_* (LC_COLLATE, LC_CTYPE, LC_MESSAGES, LC_MONETARY, LC_NUMERIC, LC_TIME) переменных. Это может использоваться приложениями для определения языка, который будет использоваться для сообщений и инструкций ошибок, последовательности сортировки, форматов даты и т.д.

  • LC_ALL Эта переменная определяет значения для всех категорий локали. Значение переменной среды LC_ALL имеет приоритет над любой другой переменной среды, начиная с LC_ (LC_COLLATE, LC_CTYPE, LC_MESSAGES, LC_MONETARY, LC_NUMERIC, LC_TIME) и переменной среды LANG.

  • LC_CTYPE Эта переменная определяет категорию локали для функций обработки символов, таких как tolower(), toupper() и isalpha(). Эта переменная среды определяет интерпретацию последовательностей байтов текстовых данных как символов (например, single- в отличие от многобайтовых символов), классификация символов (например, альфа, цифра, график) и поведение символа классы. Дополнительная семантика этой переменной, если таковая имеется, зависит от реализации.

Ответ 3

LANG, LC_CTYPE и LC_ALL являются специальными переменными среды, которые после их экспорта в среду оболочки (help export) доступны и готовы к чтению некоторыми программами, поддерживающими локаль ( форматирование естественного языка для C).

Каждая переменная устанавливает для библиотеки C понятие стиля стиля естественного языка для определенных наборов подпрограмм, например:

  • LC_ALL - установить общий язык в целом
  • LC_CTYPE - установить языковой стандарт для функций ctype и multibyte. Это контролирует распознавание символов верхнего и нижнего регистра, алфавитных или неалфавитных символов и т.д.

и другие, такие как LC_COLLATE (для подпрограмм строковой сортировки), LC_MESSAGES (для каталогов сообщений), LC_MONETARY (для форматирования денежных значений), LC_NUMERIC (для форматирования чисел), LC_TIME (для даты и время форматирования).

Что касается LANG, он используется как замена любой unset LC_* переменной (см. man locale).

Смотрите: man setlocale (BSD), man locale

Итак, когда вызываются определенные C-функции (такие как setlocale, ctype, multibyte, catopen, printf и т.д.), они читают настройки локали из файлов конфигурации и локальной среды в для управления и форматирования стиля форматирования естественного языка в соответствии со стандартами языка программирования C (см. ISO C99)

Смотрите также: C Library - < locale.h > .

Ответ 4

Ваш файл .bashrc является одним из первых файлов для чтения, он содержит различные конфигурации для вашего сеанса оболочки.

Из Какая разница между .bashrc,.bash_profile и .environment?:

.bashrc считывается только оболочкой, которая как интерактивная, так и не входящая в систему

Как описано в Определение переменной с экспортом или без нее:

Экспорт

делает переменную доступной для подпроцессов.

или

В частности, экспорт делает переменную доступной для дочерних процессов через среду.

Moar

Ответ 5

В каждом из них:

export LANG=ru_RU.UTF-8
export LC_CTYPE=ru_RU.UTF-8
export LC_ALL=ru_RU.UTF-8

Первое, что делается здесь перед export, - это присвоения через знак равенства =, то есть LANG = ru_RU.UTF-8 для первого.

В первой строке это создает новую локальную переменную оболочки в вашем запущенном сценарии bash с именем LANG. Затем содержимое LANG устанавливается в строку "ru_RU.UTF-8". Аналогично для двух других линий.


Следующим шагом будет export.

export подразумевает, что впоследствии будут созданы дочерние процессы.

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

Процесс, в котором вы работаете, в этом случае является тем, что мы называем "родительским процессом".

Профиль может порождать один или несколько дочерних процессов, например, если одна из вещей, которые вы делаете в профиле, - это запустить программу. Затем эта программа выполняется (обычно) как дочерний процесс профиля. (Это неверно, если файл находится в профиле, используя нотацию . <name>, где то, что работает, выполняется в том же процессе, что и профиль.)

Теперь вот что важно: export только отмечает LANG ! Он не экспортирует LANG.

Позже всякий раз, когда создается новый дочерний процесс (т.е. Дочерний процесс порождается этим сценарием, так что родительский родитель является этим скриптом), тогда в то время текущее значение LANG (т.е. во время создания дочернего процесса ) передается в этот новый дочерний процесс как дополнительная переменная среды.

Созданный дочерний процесс получает этот список переменных среды при запуске.

Обратите внимание, что также есть много других переменных среды, переданных дочерним процессам из родительских процессов. К ним относятся все другие переменные среды, которые также видит родительский процесс. Таким образом, ребенок наследует все переменные родительской среды.

export просто добавляет еще одну переменную среды в этот список, который видит дочерний процесс.


Также обратите внимание, что дочерний процесс получает только копию значения LANG. Другими словами, он не может изменить родительскую копию LANG. Кроме того, если родитель изменяет LANG после нереста дочернего процесса, ребенок не увидит эти изменения.


Итак, теперь давайте посмотрим на эффекты этих трех переменных окружения.

LANG - это то, что пользователь обычно устанавливает, чтобы повлиять на язык, на котором работает программа. Когда в терминале, если вы входите в env вы должны увидеть, что LANG установлен на ваш язык _ код страны. и кодирование символов.

LC_CTYPE является переопределением для LANG и переопределяет только используемый набор символов. Все остальные функции (категории) LANG все еще используются, как установлено LANG, например LC_TELEPHONE.

LC_ALL является дополнительным переопределением. Он переопределяет как LC_CTYPE, так и все категории локалей, которые были установлены LANG на данный язык и набор кодов. Обратите внимание, что LC_ALL никогда не должен устанавливаться постоянно, как для самого профиля. Он предназначен только для временного полного переопределения локалей, то есть он отменяет все категории, такие как LC_TELEPHONE, LC_MONETARY, LC_CTYPE и т.д.