linux - error - Explicar los efectos de la exportación LANG, LC_CTYPE, LC_ALL
lc_all=(unset) (5)
Consulte la página de Variables de entorno de la especificación UNIX:
LANG
Esta variable determina la categoría de configuración regional para el idioma nativo, las costumbres locales y el conjunto de caracteres codificados en ausencia de las variables de entornoLC_ALL
y otrasLC_*
(LC_COLLATE
,LC_CTYPE
,LC_MESSAGES
,LC_MONETARY
,LC_NUMERIC
,LC_TIME
). Las aplicaciones pueden usarlo para determinar el idioma que se usará para mensajes de error e instrucciones, cotejar secuencias, formatos de fecha, etc.
LC_ALL
Esta variable determina los valores para todas las categorías locales. El valor de la variable de entornoLC_ALL
tiene prioridad sobre cualquiera de las otras variables de entorno que comienzan con LC_ (LC_COLLATE,LC_CTYPE
,LC_MESSAGES
,LC_MONETARY
,LC_NUMERIC
,LC_TIME
) y la variable de entornoLANG
.
LC_CTYPE
Esta variable determina la categoría de configuración regional para las funciones de manejo de caracteres, comotolower()
,toupper()
eisalpha()
. Esta variable de entorno determina la interpretación de secuencias de bytes de datos de texto como caracteres (por ejemplo, caracteres de un solo byte en lugar de múltiples bytes), la clasificación de caracteres (por ejemplo, alfa, dígito, gráfico) y el comportamiento de las clases de caracteres . La semántica adicional de esta variable, si la hay, depende de la implementación.
Acabo de instalar Linux Mint 17 y enfrenté un problema que no podía usar el idioma ruso en la terminal.
(Ya veo
?
lugar de letras).
En un foro encontré esta solución:
Añadido en ~ / .profile:
export LANG=ru_RU.UTF-8
export LC_CTYPE=ru_RU.UTF-8
export LC_ALL=ru_RU.UTF-8
Ayudó, pero también cambió el idioma de mi interfaz a ruso (que no quería). Eso ni siquiera es un problema, pero de todos modos, me gustaría saber cómo funciona este código (cada línea).
Gracias.
Explicaré con detalle:
export LANG=ru_RU.UTF-8
Es un comando de shell que exportará una variable de entorno llamada
LANG
con el valor dado
ru_RU.UTF-8
.
Eso instruye a los programas internacionalizados a usar el idioma ruso (
ru
), variante de Rusia (
RU
), y la
UTF-8
para la salida de la consola.
Generalmente esta sola línea es suficiente.
Este otro:
export LC_CTYPE=ru_RU.UTF-8
Hace algo similar, pero le dice al programa que no cambie el idioma, sino solo el CTYPE al ruso. Si un programa puede cambiar un texto a mayúsculas, utilizará las reglas rusas para hacerlo, aunque el texto en sí mismo esté en inglés.
Vale la pena decir que mezclar
LANG
y
LC_CTYPE
puede dar resultados inesperados, porque pocas personas lo hacen, por lo que no se ha probado, a menos que tal vez:
export LANG=ru_RU.UTF-8
export LC_CTYPE=C
Eso hará que el programa salga en ruso, pero con el viejo estilo C estándar de CTYPE.
La última línea,
LC_ALL
es una anulación de último recurso, que hará que el programa ignore todas las demás variables
LC_*
y las use.
Creo que nunca deberías escribirlo en una línea de perfil, sino usarlo para ejecutar un programa en un idioma determinado.
Por ejemplo, si desea escribir un informe de error, y no desea ningún tipo de salida localizada, y no sabe qué variables
LC_*
están configuradas:
LC_ALL=C program
Acerca de cambiar el idioma de todos sus programas o solo la consola, eso depende de dónde coloque estas líneas.
Puse el mío en
~/.bashrc
para que no se apliquen a la GUI, solo a las consolas bash.
Su archivo
.bashrc
es uno de los primeros archivos que se leen, contiene varias configuraciones para su sesión de shell.
¿Cuál es la diferencia entre .bashrc, .bash_profile y .environment? :
.bashrc solo es leído por un shell que es interactivo y sin inicio de sesión
Como se explica en Definir una variable con o sin exportación :
export hace que la variable esté disponible para subprocesos.
o
Específicamente, la exportación hace que la variable esté disponible para los procesos secundarios a través del entorno.
Lamento
- lea la respuesta @lhunath en Acerca de .bash_profile, .bashrc, y ¿dónde debe escribirse el alias?
- Configurar sus sesiones de inicio de sesión con archivos de puntos
LANG
,
LC_CTYPE
y
LC_ALL
son variables de entorno especiales que, después de exportarlas al entorno de shell (
help export
), están disponibles y listas para ser leídas por ciertos programas que admiten una configuración regional (formato de lenguaje natural para C).
Cada variable establece la noción de la biblioteca C del estilo de formato de lenguaje natural para conjuntos particulares de rutinas, por ejemplo:
LC_ALL
: establece la configuración regional completa de forma genéricaLC_CTYPE
: establece una configuración regional para las funcionesctype
ymultibyte
. Esto controla el reconocimiento de mayúsculas y minúsculas, caracteres alfabéticos o no alfabéticos, etc.
y otros como
LC_COLLATE
(para rutinas de clasificación de cadenas),
LC_MESSAGES
(para catálogos de mensajes),
LC_MONETARY
(para formatear valores monetarios),
LC_NUMERIC
(para formatear números),
LC_TIME
(para formatear fechas y horas).
Con respecto a
LANG
, se usa como sustituto de cualquier variable
LC_*
(ver:
man locale
).
Ver:
man setlocale
(BSD),
man locale
Entonces, cuando se
ctype
ciertas funciones de C (como
setlocale
,
ctype
,
multibyte
,
catopen
,
printf
, etc.), leen la configuración regional de los archivos de configuración y el entorno local para controlar y formatear el estilo de formato de lenguaje natural según la programación en C estándares de idioma (ver:
ISO C99
)
Ver también: Biblioteca C - <locale.h> .
export
es confusa.
Realmente significa
mark-for-export
.
Implica que los procesos secundarios se crearán más tarde, y es entonces cuando se realizará la exportación real.
El orden de
export
de eventos es:
1-ASSIGN
,
MARK
, y ...
2-FORK
.
1) Cree una nueva variable de shell local , asígnele el valor y márquela para su posterior exportación.
2) Luego, si y cuando, el script de shell actual se BIFURCA (es decir, para crear y ejecutar procesos secundarios), inicie un proceso secundario con una COPIA de esta variable exportada, como una de sus muchas variables de entorno .
nb
(tenga en cuenta bien): no se exporta la variable hasta el paso 2, y posiblemente mucho después de que se emitió la declaración de
export
.
Entonces:
export
solo marca LANG.
No exporta LANG.
Por convención, las variables exportadas se nombran en mayúsculas.
Debido a que LANG es solo una copia, si el niño luego modifica esta variable, solo la modifica por sí misma. El padre no ve las modificaciones del niño.
Tenga en cuenta que también hay muchas otras variables de entorno que se pasan a los procesos secundarios desde los procesos principales. Estas incluyen todas las otras variables de entorno que el proceso padre también obtiene de su padre.
Entonces el niño hereda todas las variables de entorno del padre,
+ cualquier otro adicional que el padre marque para la
export
,
- menos las variables que están explícitamente
unset
.
En otras palabras, tenemos dos procesos en los que pensar: el proceso padre y cualquier proceso hijo futuro.
El proceso que está ejecutando, en este caso el
profile
, es lo que llamamos el "proceso padre".
profile
puede generar uno o más procesos secundarios, como por ejemplo si una de las cosas que haces en profile es ejecutar un programa.
Ese programa se ejecuta (normalmente) como un proceso secundario de
profile
.
(Esto no es cierto si el archivo se origina en el perfil, utilizando la notación
. <name>
o
source <name>
, donde lo que se origina se ejecuta en el mismo proceso que el
profile
).
export LANG=ru_RU.UTF-8 export LC_CTYPE=ru_RU.UTF-8 export LC_ALL=ru_RU.UTF-8
Así que ahora veamos los efectos de estas tres variables de entorno.
LANG es lo que un usuario normalmente configura para afectar el lenguaje en el que se ejecuta un programa. Cuando está en la terminal si ingresa
env | grep LANG
env | grep LANG
debería ver que LANG está configurado en su
<language>_<country-code>.<character-encoding>
, por ejemplo LANG = en_US.UTF-8.
LC_CTYPE es una anulación de LANG y anula solo el juego de caracteres utilizado. Todas las demás características (categorías) de LANG todavía se utilizan según lo establecido por LANG, por ejemplo, LC_TELEPHONE.
LC_ALL es una anulación adicional. Invalida tanto LC_CTYPE como todas las categorías de configuración regional que LANG estableció en un idioma y un conjunto de códigos determinados. Tenga en cuenta que LC_ALL nunca debe establecerse de forma persistente, como para un perfil en sí. Está destinado solo como una anulación temporal de la ubicación completa, es decir, anula todas las categorías, como LC_TELEPHONE, LC_MONETARY, LC_CTYPE, etc.