Я использую Arch Linux, и я следовал инструкциям в вики по настройке моей локали.
Почти каждая запускаемая программа жалуется на локаль - даже locale
. Это выглядит так:
% 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=
или:
% 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")
Что-то немного сбивает с толку, что у /etc/locale.gen
него есть несколько примеров; все строки UTF-8 имеют что-то «что-то. UTF-8», и locale-gen
показы запускаются en_US.UTF-8... done
во время его выполнения, но locale -a
, как предполагается, показывают вам доступные показы локалей en_US.utf8
. Я пробовал различные комбинации обоих форматов в /etc/locale-gen
и LOCALE=
в /etc/rc.conf
, но ничего не исправили проблему.
Дополнительная информация:
% locale -a
C
POSIX
en_US
en_US.iso88591
en_US.utf8
Предложение Брюса Эдигера о настройке LANG=C
и работе LC_ALL=en_US.UTF-8
(на самом деле, установка LC_ALL
исправила это, настройка LANG
не имела значения), но я хотел бы знать, что происходит. Согласно SUS , LC_ALL переопределит все другие переменные LC_ *, если он установлен и не равен нулю. В моей системе оно установлено, но оно пустое, поэтому его следует игнорировать, а вместо него следует использовать другие значения. Это не то , что происходит, кажется , что приложения вызова setlocale
с LC_ALL
, получая NULL
обратно, и генерируется ошибка, даже когда другие вызовы setlocale
возвращают хорошую строку.
Вот верхушка ltrace
из locale
(прокрутки вправо , чтобы увидеть функции возвращают значения)
% 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)
.utf8
в LOCALE
и LC_*
, но, видимо, .UTF-8
работает и здесь ... Что касается en-US: он появляется (без .utf8
) в locale -a
?
export LANG=C
и export LC_ALL=en_US.UTF-8
посмотри что получится. В моем ноутбуке Arch Linux есть LOCALE="en_US.UTF-8"
/etc/rc.conf, и я не могу понять, где мой ноутбук устанавливает LANG = C.
/etc/locale.conf
? Похоже, вы случайно написали LANG=en-US
(с дефисом) вместо LANG=en_US
(с подчеркиванием).
/etc/locale.gen
было бы тоже полезно.
locale -a
?