unsupported lc_all error en_us linux

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 entorno LC_ALL y otras LC_* ( 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 entorno LC_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 entorno LANG .

  • LC_CTYPE Esta variable determina la categoría de configuración regional para las funciones de manejo de caracteres, como tolower() , toupper() e isalpha() . 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


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érica
  • LC_CTYPE : establece una configuración regional para las funciones ctype y multibyte . 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.