arch-linux – ¿Por qué casi todos los programas se quejan de mi ubicación?

Pregunta:

Estoy usando Arch Linux y he seguido las instrucciones de la wiki sobre cómo configurar mi configuración regional.

Casi todos los programas que se ejecutan se quejan del entorno local, incluso del locale . Se parece a esto:

% locale
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=
LC_CTYPE=en_US.UTF-8
LC_NUMERIC=en-US
LC_TIME=en-US
LC_COLLATE="POSIX"
LC_MONETARY=en-US
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT=en-US
LC_IDENTIFICATION="POSIX"
LC_ALL=

o:

% perl
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
    LANGUAGE = (unset),
    LC_ALL = (unset),
    LC_TIME = "en-US",
    LC_NUMERIC = "en-US",
    LC_MONETARY = "en-US",
    LC_MEASUREMENT = "en-US",
    LC_CTYPE = "en_US.UTF-8",
    LANG = (unset)
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C")

Algo un poco confuso es que /etc/locale.gen tiene varios ejemplos; todas las líneas UTF-8 tienen " en_US.UTF-8... done -8", y la ejecución de locale-gen muestra en_US.UTF-8... done mientras se está ejecutando, pero locale -a , que se supone que muestra las configuraciones regionales disponibles, muestra en_US.utf8 . LOCALE= varias combinaciones de ambos formatos en /etc/locale-gen y LOCALE= en /etc/rc.conf , pero nada solucionó el problema.

Información adicional:

% locale -a
C
POSIX
en_US
en_US.iso88591
en_US.utf8

La sugerencia de Bruce Ediger de configurar LANG=C y LC_ALL=en_US.UTF-8 funcionó (de hecho, configurar LC_ALL solucionó, configurar LANG no importaba), pero me gustaría saber qué está sucediendo. Según SUS , LC_ALL anulará todas las demás variables LC_ * si está establecido y no es nulo. En mi sistema, está configurado, pero es nulo, por lo que debe ignorarse y, en su lugar, deben usarse otros valores. Eso no es lo que está sucediendo, parece que las aplicaciones están llamando a setlocale con LC_ALL , obteniendo un valor NULL y generando un error, incluso cuando otras llamadas a setlocale devuelven una buena cadena.

Aquí está la parte superior de un ltrace de locale (desplácese hacia la derecha para ver los valores de retorno de la función)

% ltrace locale
(0, 0, 0, -1, 0x7f5c1ae44510)                                                                      = 0x7f5c1ae47140
__libc_start_main(0x401d70, 1, 0x7fff7c8cfbf8, 0x404610, 0x4046a0 <unfinished ...>
setlocale(0, "")                                                                                   = "en_US.UTF-8"
setlocale(5, "")                                                                                   = "en_US.UTF-8"
textdomain("libc")                                                                                 = "libc"
argp_parse(0x607280, 1, 0x7fff7c8cfbf8, 0, 0x7fff7c8cfad4)                                         = 0
setlocale(6, "")                                                                                   = NULL
dcgettext(0, 0x405aa8, 5, 0, 0)                                                                    = 0x405aa8
error(0, 2, 0x405aa8, 1, 0locale: Cannot set LC_ALL to default locale: No such file or directory)  

Respuesta:

Le falta un archivo que se usaría para establecer la configuración regional predeterminada en ausencia de $LANG o $LC_ALL (o todos los $LC_whatever más específicos) configurados.

En glibc más antiguo, es /usr/lib/locale/locale-archive . Debido a que GNU / Linux es caótico, debe usar strace para determinar qué archivos se esperan en las versiones particulares en uso en su máquina:

strace -e file locale
execve("/usr/bin/locale", ["locale"], [/* 36 vars */]) = 0
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
open("/lib/libc.so.6", O_RDONLY)        = 3
open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 3

———————- Comentarios agregados 1 día después:

ltrace -S debería estar bien, ya que muestra llamadas al sistema.

De lo contrario, "ltrace" no es muy útil (es decir, es contraproducente frente a strace ), porque solo muestra las llamadas superiores. Esos son obvios ( setlocale(3) ), mientras que el problema real ocurre dentro de libc .

Parece que tiene instalados los datos locales sin procesar , ya que en_US.UTF-8 funciona.

Si es así, algo como esto debería solucionar su problema, estableciendo un valor predeterminado para todo el sistema:

localedef -f UTF-8 -i en_US en_US.UTF-8

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım