Ambiente correto

15

Estou usando o zsh e o gdm para executar o gnome. Algum tempo atrás, descobri que as variáveis ​​não estão definidas corretamente. Por exemplo, LANG / LC_ALL está incorreto (em ""vez de en_GB.UTF-8).

Eu divido o .zshrcem .zshrce .profile. Neste último, defino as variáveis ​​de ambiente, mas como posso definir as variáveis ​​antes do início da sessão? Tentei algumas opções ( .xinitrc, .xsessionrc) , mas nenhuma parecia funcionar.

Editar Para esclarecer - eu usei .profilee manualmente sourced-lo em .zshrc. Não muda a pergunta de qualquer maneira.

Maciej Piechotka
fonte
Você .profilenão está carregado ou algo substitui as variáveis ​​de localidade? (Tente configurar alguma outra variável como export MACIEJ_PROFILE=yespara certificar-se. set -xNo .profilepode ser uma boa maneira de verificar o que está sendo executado em e depois .profile, se ele é lido em tudo.) Não há nenhum ponto em terceirização .profilede .zshrc.
Gilles 'SO- stop be evil'
Isso é um problema nas janelas do terminal ou em outro lugar? Você obtém as configurações de localidade desejadas ao executar ssh localhost zsh? Que tal ssh localhost bash? Se o bash estiver ok, mas não o zsh, talvez você coloque algo /etc/zshenvou ~/.zshenv(o que é sempre uma péssima idéia).
Gilles 'SO- stop be evil'
Não, o shell está funcionando bem (antes e depois da divisão). O problema é que gnome-sessionnão possui essas variáveis ​​definidas.
Maciej Piechotka

Respostas:

21

A maneira mais simples é inventar uma máquina do tempo, visitar as várias pessoas que criaram os arquivos de inicialização do shell e dizer-lhes para distinguir claramente três coisas:

  • configuração da sessão, por exemplo, variáveis ​​de ambiente;
  • início da sessão, por exemplo, iniciando um shell de linha de comando ou um gerenciador de janelas ou executando startx;
  • inicialização do shell, por exemplo, aliases, prompt, ligações de teclas.

Não é muito difícil obter a sessão versus o shell de maneira portátil: a inicialização no tempo de login entra .profile(ou .zprofile, ou .login), a inicialização do shell entra .bashrcou .zshrc. Eu escrevi anteriormente sobre .bash_profile, zsh vs. outros shells , mais sobre portabilidade (principalmente sobre bash) , mais sobre quem lê.profile .

Um problema restante é distinguir entre a configuração e o início da sessão. Na maioria dos casos, ~/.profileé executado quando você efetua login e pode dobrar como ambos, mas há exceções:

  • Se o seu shell de login for (t) csh ou zsh ~/.logine ~/.zprofilefor originado em vez de ~/.profile. Ditto para o bash e ~/.bash_profile, mas isso é facilmente resolvido com a terceirização ~/.profilede ~/.bash_profile.
  • Se você efetuar login em um gerenciador de exibição (xdm, gdm, kdm,…), se a sua ~/.profileleitura será dependente da versão do programa, da sua distribuição (Linux ou não) e do tipo de sessão que você escolher.
    • Se você conta com o gerenciador de exibição para iniciar uma sessão para você, é .profilenecessário definir variáveis ​​de ambiente, mas não iniciar uma sessão (por exemplo, um gerenciador de janelas).
    • O arquivo de configuração tradicional para as sessões X é ~/.xsessionfazer a configuração e o início da sessão. Portanto, o arquivo pode ser essencialmente . ~/.xsession; . ~/.xinitrc. Algumas fontes de distribuição ~/.profileantes ~/.xsession. As distribuições modernas são ~/.xsessionoriginadas apenas quando você seleciona uma sessão "personalizada" no gerenciador de exibição, e essa sessão nem sempre está disponível.
    • Seu gerenciador de sessões pode ter sua própria maneira de definir variáveis ​​de ambiente. (Essa é uma parte opcional do seu ambiente de área de trabalho, escolhida por você por meio de um arquivo de configuração ou pela seleção de um tipo de sessão ao efetuar login; não confunda com os scripts de inicialização de sessão fornecidos pelo gerenciador de exibição, que são executados sob seu usuário, mas escolhido em todo o sistema. Sim, é uma bagunça.)

Em resumo, ~/.profileé o lugar certo para variáveis ​​de ambiente. Se não for lido, tente fazer a busca ~/.xsession(e inicie os programas X a partir daí) ou procure um método específico do sistema (que pode depender da sua distribuição, gerenciador de exibição, se houver, tipo de sessão, gerenciador de exibição e ambiente de área de trabalho ou gerenciador de sessões).

Gilles 'SO- parar de ser mau'
fonte
.xsessionfoi o arquivo que eu estava procurando.
Maciej Piechotka
1
Concordo plenamente com tudo, exceto o seu resumo. Eu não acho que você estabeleceu esse ponto. Se suas .profilefontes .bashrcou similares, então você pode confiavelmente definir variáveis de ambiente em .bashrcpara sessões não só login, mas para novas conchas que necessitam de definições diferentes, por exemplo, se você iniciar um xtermdos gnome-terminale quer diferente dircolors.
Mikel
@ Mikel Se você definir variáveis ​​de ambiente .bashrc, elas substituirão as configurações anteriores. Por exemplo, se você iniciou uma instância Screen ou Tmux com variáveis ​​de ambiente específicas, qualquer coisa que você definir .bashrcsubstituirá essas configurações. LS_COLORSé um caso especial porque é realmente uma configuração por terminal; idealmente, ele deve ser definido pelo emulador de terminal e configurá-lo em um arquivo shell rc é uma solução alternativa de melhor esforço.
Gilles 'SO- stop be evil'
1

Na documentação do Gentoo, há o artigo Guia de Localização do Gentoo Linux . O Capítulo 3 trata da configuração da localidade.

Geralmente, os usuários definem apenas a variável LANG globalmente. Este exemplo é para um código de idioma alemão unicode:

Listagem de código 3.1: Definindo a localidade padrão do sistema em /etc/env.d/02locale

LANG="en_GB.UTF-8"

No meu Gentoo LANGestá definido neste arquivo e tudo está funcionando corretamente ...

pbm@tauri ~ $ cat /etc/env.d/02locale 
LANG="pl_PL.UTF-8"

pbm@tauri ~ $ locale
LANG=pl_PL.UTF-8
LC_CTYPE="pl_PL.UTF-8"
LC_NUMERIC="pl_PL.UTF-8"
LC_TIME="pl_PL.UTF-8"
LC_COLLATE="pl_PL.UTF-8"
LC_MONETARY="pl_PL.UTF-8"
LC_MESSAGES="pl_PL.UTF-8"
LC_PAPER="pl_PL.UTF-8"
LC_NAME="pl_PL.UTF-8"
LC_ADDRESS="pl_PL.UTF-8"
LC_TELEPHONE="pl_PL.UTF-8"
LC_MEASUREMENT="pl_PL.UTF-8"
LC_IDENTIFICATION="pl_PL.UTF-8"
LC_ALL=
pbm
fonte
Lembre-se de que a parte que você citou está correta, mas o guia também recomenda definir uma variável de ambiente .bashrcincorreta (consulte minha resposta e, em particular, superuser.com/questions/217431 ).
Gilles 'SO- stop be evil'
Obrigado por informações tão detalhadas ... :) Eu nunca usei essa parte .bashrc - as configurações env.dsão mais universais.
pbm
Também é por sistema, em vez de por usuário. Prefiro manter as configurações do sistema separadas das configurações do usuário.
Maciej Piechotka