Warum beschwert sich fast jedes Programm über meine Gebietsschemaeinstellung?

Warum beschwert sich fast jedes Programm über meine Gebietsschemaeinstellung?

Ich verwende Arch Linux und habe die Anweisungen auf derWikizum Festlegen meines Gebietsschemas.

Fast jedes laufende Programm beschwert sich über das Gebietsschema - sogar locale. Es sieht so aus:

% 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=

oder:

% 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")

Etwas verwirrend ist, dass es /etc/locale.genmehrere Beispiele gibt; alle UTF-8-Zeilen haben „irgendwas.UTF-8“, und running locale-genzeigt en_US.UTF-8... donewährend der Ausführung an, aber locale -a, das Ihnen die verfügbaren Gebietsschemas anzeigen soll, zeigt an . Ich habe verschiedene Kombinationen beider Formate in und in en_US.utf8ausprobiert , aber nichts hat das Problem behoben./etc/locale-genLOCALE=/etc/rc.conf

Weitere Informationen:

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

Bruce Edigers Vorschlag, LANG=Cund zu setzen, LC_ALL=en_US.UTF-8hat funktioniert (tatsächlich hat das Setzen LC_ALLdas Problem behoben, das Setzen LANGwar egal), aber ich würde gerne wissen, was passiert. LautSUS, LC_ALL überschreibt alle anderen LC_*-Variablen, wenn es gesetzt und nicht null ist. In meinem System ist es gesetzt, aber null, also sollte es ignoriert und stattdessen andere Werte verwendet werden. Das ist nicht das, was passiert, es scheint, dass Anwendungen setlocalemit aufrufen LC_ALL, eine NULLRückmeldung erhalten und einen Fehler generieren, selbst wenn andere Aufrufe setlocaleeine gute Zeichenfolge zurückgeben.

Hier ist die Spitze eines ltracevon locale(nach rechts scrollen, um die Rückgabewerte der Funktion anzuzeigen)

% 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)  

Antwort1

Ihnen fehlt eine Datei, die als Standard für das Gebietsschema verwendet wird, wenn $LANGoder $LC_ALL(oderalledes spezifischeren $LC_whatever) festgelegt wird.

Bei älteren glibc-Versionen ist es /usr/lib/locale/locale-archive. Da GNU/Linux chaotisch ist, sollten Sie strace verwenden, um zu ermitteln, welche Dateien in den auf Ihrem Computer verwendeten Versionen erwartet werden:

strace -e Dateigebietsschema
execve("/usr/bin/locale", ["locale"], [/* 36 Variablen */]) = 0
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (Keine solche Datei oder kein solches Verzeichnis)
öffnen("/etc/ld.so.cache", O_RDONLY) = 3
öffnen("/lib/libc.so.6", O_RDONLY) = 3
öffnen("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 3

----------------------Kommentare, die 1 Tag später hinzugefügt wurden:

ltrace -Ssollte in Ordnung sein, da es Systemaufrufe anzeigt.

Ansonsten ist „ltrace“ nicht sehr hilfreich (d. h. es ist kontraproduktiv gegenüber strace), da es nur die obersten Aufrufe anzeigt. Diese sind offensichtlich ( setlocale(3)), während das eigentliche Problem innerhalb von auftritt libc.

Es klingt, als hätten Sie dierohLokale Daten installiert, da en_US.UTF-8funktioniert.

Wenn ja, sollte das Folgende Ihr Problem beheben und einen systemweiten Standard festlegen:

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

Antwort2

/etc/locale.confIch hatte heute nach der Einrichtung dasselbe Problem (im Zusammenhang mit den jüngsten Änderungen an /etc/rc.conf). In meinem Fall stellte sich heraus, dass die Gebietsschemas nicht installiert waren.

Überprüfen Sie /etc/locale.gen. Alle Gebietsschemas, auf die Ihre Umgebungsvariablen verweisen, müssen dort aktiviert (d. h. nicht auskommentiert) sein. Nachdem Sie Ihre Änderungen vorgenommen haben, führen Sie sudo locale-gendie Installation der ausgewählten Gebietsschemas aus.

Antwort3

Im Anschluss daranVerknüpfunglöst mein Problem:

sudo localectl set-locale LANG=en_CA.UTF-8
# or change to en_US.UTF-8 depends on your locale-gen

Es wird eine Datei generiert /etc/locale.conf, die dieses Problem behebt

Antwort4

Vielleicht ist eine Ihrer Einstellungen ungültig? Dies sind meine Gebietsschemaeinstellungen als Referenz; sie verursachen keine Fehler (KUbuntu 12.04):

LANG=en_AU.UTF-8
LANGUAGE=
LC_CTYPE="en_AU.UTF-8"
LC_NUMERIC="en_AU.UTF-8"
LC_TIME="en_AU.UTF-8"
LC_COLLATE="en_AU.UTF-8"
LC_MONETARY="en_AU.UTF-8"
LC_MESSAGES="en_AU.UTF-8"
LC_PAPER="en_AU.UTF-8"
LC_NAME="en_AU.UTF-8"
LC_ADDRESS="en_AU.UTF-8"
LC_TELEPHONE="en_AU.UTF-8"
LC_MEASUREMENT="en_AU.UTF-8"
LC_IDENTIFICATION="en_AU.UTF-8"
LC_ALL=

verwandte Informationen