Warum beschwert sich fast jedes Programm über mein Gebietsschema?

29

Ich verwende Arch Linux und folge den Anweisungen im Wiki zum Festlegen meines Gebietsschemas.

Nahezu jedes Programm, das ausgeführt wird, beklagt sich über das Gebietsschema - sogar locale. Es sieht aus wie das:

% 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 das /etc/locale.genmehrere Beispiele hat; Alle UTF-8-Zeilen haben "something.UTF-8" und laufen locale-genShows, en_US.UTF-8... donewährend es läuft, aber locale -adas soll Ihnen die verfügbaren Locales-Shows zeigen en_US.utf8. Ich habe verschiedene Kombinationen beider Formate in /etc/locale-genund LOCALE=in ausprobiert /etc/rc.conf, aber nichts hat das Problem behoben.

Zusätzliche Information:

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

Bruce Edigers Vorschlag, zu setzen LANG=Cund zu LC_ALL=en_US.UTF-8arbeiten (in der Tat, das Setzen hat es LC_ALLbehoben, das Setzen LANGwar egal), aber ich würde gerne wissen, was passiert. Laut SUS überschreibt LC_ALL alle anderen LC_ * -Variablen, wenn es gesetzt und nicht null ist. In meinem System ist es festgelegt, aber es ist null, daher sollte es ignoriert werden und stattdessen sollten andere Werte verwendet werden. Das ist nicht , was passiert ist , scheint es , dass Anwendungen fordern setlocalemit LC_ALLeiner immer NULLwieder, und einen Fehler zu generieren, auch wenn andere Anrufe setlocaleeine gute String zurück.

Hier ist der Anfang eines ltracevon locale(scrollen Sie nach rechts, um Funktionsrückgabewerte zu sehen)

% 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)  
Shawn J. Goff
quelle
Können Sie die Ausgabe von teilen locale -a?
NJSG
Ich wollte darauf hinweisen, dass Sie .utf8in LOCALEund verwenden sollten LC_*, aber anscheinend .UTF-8funktioniert es auch hier ... Was en-US betrifft: Erscheint es (ohne .utf8) in locale -a?
NJSG
1
Mach export LANG=Cund export LC_ALL=en_US.UTF-8und schau was passiert. Mein Arch Linux-Laptop hat LOCALE="en_US.UTF-8"/etc/rc.conf und ich kann nicht herausfinden, wo mein Laptop LANG = C setzt.
Bruce Ediger
Können Sie den Inhalt Ihrer veröffentlichen /etc/locale.conf? Es sieht so aus, als hätten Sie versehentlich LANG=en-US(mit Bindestrich) statt LANG=en_US(mit Unterstrich) geschrieben.
Mikel
Und der Inhalt von /etc/locale.genwäre auch nützlich.
Mikel

Antworten:

18

Es fehlt eine Datei, mit der das Gebietsschema standardmäßig festgelegt wird, wenn nicht $LANGoder $LC_ALL(oder nur im Einzelnen $LC_whatever) festgelegt wurde.

In älteren Versionen ist es / usr / lib / locale / locale-archive. Da GNU / Linux chaotisch ist, sollten Sie mit strace bestimmen, welche Dateien in den auf Ihrem Computer verwendeten Versionen erwartet werden:

strace -e file locale
execve ("/ usr / bin / locale", ["locale"], [/ * 36 vars * /]) = 0
access ("/ etc / ld.so.preload", R_OK) = -1 ENOENT (Keine solche Datei oder kein solches Verzeichnis)
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

---------------------- Kommentare hinzugefügt 1 Tag später:

"ltrace -S" sollte in Ordnung sein, da es Syscalls anzeigt.

Andernfalls ist "ltrace" nicht sehr hilfreich (dh es ist kontraproduktiv gegenüber "strace"), da nur die obersten Aufrufe angezeigt werden. Diese liegen auf der Hand (setlocale (3)), während das eigentliche Problem in libc auftritt.

Es klingt wie Sie die haben rohe locale Daten installiert, da en_US.UTF-8 funktioniert.

Wenn ja, sollte so etwas Ihr Problem beheben und einen systemweiten Standard festlegen:

localedef -f UTF-8 -i en_US en_US.UTF-8
AR
quelle
sudo localedef -f UTF-8 -i en_US en_US.UTF-8funktioniert auf Raspbian 2018-11-13 Lite.
Ciro Santilli am
6

Ich hatte das gleiche Problem, nachdem ich es /etc/locale.conferst heute eingerichtet hatte (im Zusammenhang mit den letzten Ä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 (dh nicht auskommentiert) sein. Nachdem Sie Ihre Änderungen vorgenommen haben, führen Sie sudo locale-genden Befehl aus, um die ausgewählten Ländereinstellungen zu installieren.

Stefan Majewsky
quelle
2

Der folgende Link lö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

Kokizzu
quelle
1

Ich hatte vor kurzem ähnliche Probleme, alle Unicode-Dateinamen wurden falsch angezeigt, als ich versehentlich die Datei 'LOCALE = en_US.utf8' in entfernte /etc/rc.conf. Also habe ich das Boot-Skript überprüft:

if [[ $DAEMON_LOCALE != [nN][oO] ]]; then
    export LANG=${LOCALE:-C}
    if [[ -r /etc/locale.conf ]]; then
        parse_envfile /etc/locale.conf "${localevars[@]}"
    fi
else
    export LANG=C
fi

Einfache Lösung ist sowohl überprüfen DAEMON_LOCALEund LOCALEin /etc/rc.conf, stellen Sie sicher , dass der erste war nicht , nound die zweite war nicht leer.

Gänseblümchen
quelle
-1

Vielleicht ist eine Ihrer Einstellungen ungültig? Dies sind meine Ländereinstellungen 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=
dwurf
quelle