
Estou usando o Arch Linux e segui as instruções nowikisobre como definir minha localidade.
Quase todos os programas executados reclamam da localidade - até mesmo locale
. Se parece com isso:
% 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=
ou:
% 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 um pouco confuso é que /etc/locale.gen
possui vários exemplos; todas as linhas UTF-8 têm "something.UTF-8" e a execução locale-gen
mostra en_US.UTF-8... done
enquanto está em execução, mas locale -a
, que deve mostrar os locais disponíveis, mostra en_US.utf8
. Tentei várias combinações de formatos in /etc/locale-gen
e LOCALE=
in /etc/rc.conf
, mas nada resolveu o problema.
Informações adicionais:
% locale -a
C
POSIX
en_US
en_US.iso88591
en_US.utf8
A sugestão de configuração de Bruce Ediger LANG=C
funcionou LC_ALL=en_US.UTF-8
(na verdade, a configuração LC_ALL
corrigiu, a configuração LANG
não importava), mas eu gostaria de saber o que está acontecendo. De acordo comSUS, LC_ALL substituirá todas as outras variáveis LC_* se estiver definido e não nulo. No meu sistema, está definido, mas é nulo, portanto deve ser ignorado e outros valores devem ser usados. Não é isso que está acontecendo, parece que aplicações estão chamando setlocale
with LC_ALL
, recebendo NULL
back e gerando erro, mesmo quando outras chamadas para setlocale
retornar uma string boa.
Aqui está o topo de um ltrace
( locale
role para a direita para ver os valores de retorno da função)
% 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)
Responder1
Está faltando um arquivo que seria usado para padronizar a localidade na ausência de $LANG
ou $LC_ALL
(outodosdo mais específico $LC_whatever
) sendo definido.
Na glibc mais antiga, é /usr/lib/locale/locale-archive
. Como o GNU/Linux é caótico, você deve usar strace para determinar quais arquivos são esperados nas versões específicas em uso na sua máquina:
strace -e local do arquivo execve("/usr/bin/locale", ["locale"], [/* 36 vars */]) = 0 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (Esse arquivo ou diretório não existe) 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
----------------------Comentários adicionados 1 dia depois:
ltrace -S
deve estar bem, pois mostra syscalls.
Caso contrário, "ltrace" não é muito útil (ou seja, é contraproducente versus strace
), porque mostra apenas as chamadas superiores. Esses são óbvios ( setlocale(3)
), enquanto o verdadeiro problema acontece dentro de libc
.
Parece que você tem ocrudados de localidade instalados, desde que en_US.UTF-8
funcionam.
Nesse caso, algo assim deve resolver o seu problema, definindo um padrão para todo o sistema:
localedef -f UTF-8 -i en_US en_US.UTF-8
Responder2
Tive o mesmo problema após a configuração /etc/locale.conf
hoje (relacionado às alterações recentes em /etc/rc.conf
. No meu caso, descobriu-se que as localidades não estavam instaladas.
Verificar /etc/locale.gen
. Todos os locais aos quais suas variáveis de ambiente fazem referência devem estar ativados (ou seja, não comentados) ali. Depois de fazer as alterações, execute sudo locale-gen
para instalar as localidades selecionadas.
Responder3
Seguindo istolinkresolve meu problema:
sudo localectl set-locale LANG=en_CA.UTF-8
# or change to en_US.UTF-8 depends on your locale-gen
ele gera um arquivo /etc/locale.conf
que corrige esse problema
Responder4
Talvez uma de suas configurações seja inválida? Estas são minhas configurações de localidade para referência; eles não causam erros (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=