Como remover localidades do sistema , em oposição a localidades de pacote , conforme solicitado em Como remover localidades desnecessárias? ?
Estou recebendo os seguintes erros recentemente :
locale: Cannot set LC_ALL to default locale: No such file or directory
A única en
localidade que tenho no meu sistema:
$ grep -r en /var/lib/locales/supported.d/*
/var/lib/locales/supported.d/local: en_US ISO-8859-1
/var/lib/locales/supported.d/local: en_US.UTF-8 UTF-8
$ locale -a | grep en
en_US
en_US.iso88591
en_US.utf8
mas não en
, como reclamado por perl
:
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = "",
LC_ALL = (unset),
LC_MEASUREMENT = "en",
LC_PAPER = "en",
LC_MONETARY = "en",
LC_NAME = "en",
LC_ADDRESS = "en",
LC_NUMERIC = "en",
LC_TELEPHONE = "en",
LC_IDENTIFICATION = "en",
LC_TIME = "en",
LANG = "C"
Então eu adiciono a localidade en
por:
% locale-gen en
Generating locales (this might take a while)...
en_AG.UTF-8... done
en_AU.UTF-8... done
en_BW.UTF-8... done
en_CA.UTF-8... done
en_DK.UTF-8...^C
Não quero nenhuma das localidades acima (apenas en_US
), mas agora não consigo me livrar delas - segui as etapas em
https://serverfault.com/questions/394610/remove-a-locale-in- ubuntu
Mas quando se trata da última etapa, ainda estou recebendo:
% locale-gen
Generating locales (this might take a while)...
en_AG.UTF-8... done
en_AU.UTF-8... done
en_BW.UTF-8... done
en_CA.UTF-8... done
en_DK.UTF-8...^C
Como remover todas as localidades acima e manter apenas en_US
?
Conclusão e Suplemento
Graças à resposta de Gunnar, é de fato causado por entradas em /etc/locale.gen
, para essas localidades extras. Apenas FTR, isso é o que locale-gen en
mudou em /etc/locale.gen
:
$ sed '/^#/d; /en/p;' /etc/locale.gen
en_AG UTF-8
en_AG UTF-8
en_AU.UTF-8 UTF-8
en_AU.UTF-8 UTF-8
en_BW.UTF-8 UTF-8
en_BW.UTF-8 UTF-8
en_CA.UTF-8 UTF-8
en_CA.UTF-8 UTF-8
en_DK.UTF-8 UTF-8
en_DK.UTF-8 UTF-8
en_GB.UTF-8 UTF-8
en_GB.UTF-8 UTF-8
en_HK.UTF-8 UTF-8
en_HK.UTF-8 UTF-8
en_IE.UTF-8 UTF-8
en_IE.UTF-8 UTF-8
en_IL UTF-8
en_IL UTF-8
en_IN UTF-8
en_IN UTF-8
en_NG UTF-8
en_NG UTF-8
en_NZ.UTF-8 UTF-8
en_NZ.UTF-8 UTF-8
en_PH.UTF-8 UTF-8
en_PH.UTF-8 UTF-8
en_SC.UTF-8 UTF-8
en_SC.UTF-8 UTF-8
en_SG.UTF-8 UTF-8
en_SG.UTF-8 UTF-8
en_US.UTF-8 UTF-8
en_US.UTF-8 UTF-8
en_ZA.UTF-8 UTF-8
en_ZA.UTF-8 UTF-8
en_ZM UTF-8
en_ZM UTF-8
en_ZW.UTF-8 UTF-8
en_ZW.UTF-8 UTF-8
Como comparação, aqui está a aparência do padrão (ou seja, sem nenhuma das localidades extras acima):
$ sed '/^#/d;' /etc/locale.gen; echo ---
---
Você deve editar
/etc/locale.gen
e comentar as localidades que não deseja. Então corraNão existe nenhuma localidade com o nome
en
. O que você provavelmente deseja usar éen_US.UTF-8
e nãoen_US
. (O último habilita a codificação latin1.)Nota: Alguns dos comandos abaixo requerem privilégios de root, considere o uso de
sudo
.Informação básica
De acordo com
man locale-gen
, as localidades são definidas em vários arquivos.As localidades são compiladas (geradas) em um único arquivo.
Detalhes abrangentes sobre localidades no Arch Wiki .
Verificando localidades e a localidade
Para listar as localidades disponíveis (conhecidas), execute qualquer um dos comandos a seguir (com pequenas diferenças de saída).
Para verificar as localidades (já) geradas, execute o comando a seguir.
Para verificar a localidade usada atualmente, execute qualquer um dos comandos a seguir (com pequenas diferenças de saída).
Configurando e gerando (novas) localidades
As localidades geralmente são definidas removendo os comentários de linhas em
/etc/locale.gen
, após o que a execuçãolocale-gen
é necessária.Isso irá compilar (gerar) localidades
/usr/lib/locale/locale-archive
para cada linha não comentada em/etc/locale.gen
e em/var/lib/locales/supported.d/
, sejam elas compiladas anteriormente ou não.Alternativamente, o comando
irá descomentar a linha correspondente
locale-gen
enquanto gera a localidade desejada e somente esta.Nota: A implementação de
locale-gen
depende da distribuição. Por exemplo, o comando acima é válido no Ubuntu/Debian, mas não no ArchLinux.Removendo localidades
Ao emitir
locale-gen
, o arquivo compilado é apagado e todas as localidades dentro/etc/locale.gen
e abaixo/usr/lib/locale/locale-archive
são geradas novamente. O comandolocale-gen --purge <locale>
não faz o que o modificador sugere, mas o contrário: remove todas as localidades compiladas, exceto as indicadas. Para garantir que apenas localidades específicas sejam geradas quandolocale-gen
for emitida ou e a atualização for executada, ambas/etc/locale.gen
devem/usr/lib/locale/locale-archive
ser consideradas.Para remover localidades em
/etc/locale.gen
, simplesmente comente as linhas desejadas e gere novamente as localidades usandolocale-gen
.Para remover localidades abaixo
/var/lib/locales/supported.d/
é mais complicado. Como qualquer arquivo/var/lib/locales/supported.d/<code>
depende do pacotelanguage-pack-<code>-base
, qualquer alteração no primeiro será restaurada quando o último for atualizado. Para resolver isso, basta manter os pacotes que atualizam os arquivos em/var/lib/locales/supported.d/
. O comando que faz isso no Ubuntu/Debian é o seguinte.Para atualizar um pacote retido, você deve desmarcá -lo ou simplesmente
--ignore-hold
.Gambiarra. Uma solução mais intrusiva, mas geral, que impede alterações
/var/lib/locales/supported.d/
é definir arquivos nele com o atributo "immutable (i)" . Então, em vez de remover arquivos, esvazie-os. Por exemplo:Configurando a localidade
Definir e gerar códigos de idioma não define o código de idioma do sistema. Qualquer um dos comandos a seguir consegue isso.
Quais localidades estão instaladas na minha máquina?
Você pode verificar quais localidades são geradas e configuradas em seu sistema usando o comando locale:
locale
... lista a configuração de localidade atuallocale -a
... lista todas as localidades que foram geradas em seu sistemalocale -a -v
... lista todas as localidades e mostra informações adicionais úteis (como nomes de diretórios que contêm os arquivos de dados de informações de localidade)O último comando acima faz você ver que todos os locais gerados estão localizados em
/usr/lib/locale/
, e você pode remover qualquer um deles se desnecessário. Cada pacote de informações de localidade é um diretório contendo arquivos de texto e outros diretórios.Localidades compatíveis
Todas as localidades que você deseja que seu sistema suporte estão listadas nos arquivos de texto em
/var/lib/locales/supported.d/
. Esses arquivos possuem duas colunas, tag de idioma e mapa de caracteres.Eu quero que meu sistema saiba apenas inglês dos EUA, então tenho apenas um arquivo lá, chamado
en
, que contém apenas uma única linha:Mensagens de erro
Se forem exibidas mensagens de erro ao emitir o comando locale, por exemplo
verifique se o arquivo
/etc/default/locale
existe e tem conteúdo adequado, como:Livre-se de dados de localidade desnecessários - passo a passo
Agora sabemos todos os detalhes necessários para começar a limpar as informações de localidade do nosso sistema:
/var/lib/locales/supported.d/
e remova todas as localidades desnecessárias (uma localidade por linha)/etc/default/locale
(veja acima um exemplo)rm -rfv /usr/lib/locale/*
locale-gen
Isso é tudo! Reinicie sua máquina para que suas alterações tenham efeito. Em seguida, execute um ou mais dos exemplos de comando de localidade acima para garantir que o resultado seja o esperado.
Referência:
https://www.linuxquestions.org/questions/blog/bittner-195120/remove-unwanted-locales-on-ubuntu-debian-3281/