Onde declarar variáveis ​​de ambiente?

59

Quais são os locais corretos para:

  1. Variáveis ​​de ambiente globais destinadas a afetar todos os usuários?
  2. Variáveis ​​de ambiente específicas do usuário?
Ivan
fonte

Respostas:

16

Eu acho que a página wiki da comunidade sobre variáveis ​​de ambiente o ajudará a resolver

sagarchalise
fonte
2
O problema é que o documento vinculado está confuso e / ou completamente errado na parte das variáveis ​​específicas do usuário. Ainda estou tentando encontrar uma maneira agnóstica de fazer isso. $ HOME / .profile é provavelmente a melhor aposta ...
Rmano
16
Cole o texto ou tire uma foto do conteúdo vinculado - ele pode não estar disponível no futuro!
Nam G VU
4
Embora isso possa teoricamente responder à pergunta, seria preferível incluir aqui as partes essenciais da resposta e fornecer o link para referência.
Thomas Ward
75

Para adicionar à resposta de sagarchalise, posso resumir o que o link sugere como locais apropriados para as configurações.

Para configurações globais, variáveis ​​de ambiente em todo o sistema

  • Usar /etc/environment
  • Não use /etc/profileou/etc/bash.bashrc

Na página:

/etc/environment[...] se destina especificamente a configurações de variáveis ​​de ambiente em todo o sistema. Não é um arquivo de script, mas consiste em expressões de atribuição, uma por linha. Especificamente, esse arquivo armazena as configurações de local e de caminho em todo o sistema.

Usar /etc/profileé um caminho bastante Unix-y, mas sua funcionalidade é bastante reduzida no Ubuntu. Existe apenas para apontar /etc/bash.bashrce para coletar entradas /etc/profile.d.

No meu sistema, a única entrada interessante em profile.d é /etc/profile.d/bash_completion.sh.

Para configurações locais ou por usuário

Uma versão anterior da página Ubuntu é recomendada ~/.pam_environment, mas a página atualmente sugere que, se isso não funcionar, você deve usar

  • ~/.profile - Este é provavelmente o melhor arquivo para inserir atribuições de variáveis ​​de ambiente, uma vez que é executado automaticamente pelo DisplayManager durante a sessão da área de trabalho do processo de inicialização, bem como pelo shell de login quando um faz logon no console de texto.

  • ~/.bash_profileou ~./bash_login- Se um deles existir, o bash o executa em vez de ~/.profilequando o bash é iniciado como um shell de logon. Bash vai preferir ~/.bash_profilea ~/.bash_login. [...] Esses arquivos não influenciam uma sessão gráfica por padrão ".

  • ~/.bashrc - "... pode ser o local mais fácil para definir variáveis".
belacqua
fonte
1
Quais programas leem /etc/environmente quando? Não parece trabalhar com cron, mesmo quando se usaSHELL=/bin/bash
SystemParadox
1
Parece que / etc / environment faz parte do PAM, o que significa que ele deve definir o ambiente padrão para todos os processos. O cron é especial (ou seja, quebrado) em substituir especificamente esse ambiente pelo seu próprio.
SystemParadox
então como se comporta .bashrc? após bash_profile? em vez de .profile?
opensas 01/08/13
1
@opensas Você provavelmente deve fazer uma pergunta separada, referenciando esta ou a resposta.
Belacqua
@belacqua digamos que eu preciso adicionar 2 ou mais variáveis de ambiente para /etc/environmentgostam JAVA_HOME="/opt/java" e ANT_HOME="/opt/ant" como fazê-lo
Kasun Siyambalapitiya
7

Você tem:

/ etc / profile: arquivo .profile em todo o sistema para os shell Bourne (sh (1)) e shells compatíveis com Bourne (bash (1), ksh (1), ash (1), ...).

que em Lucid e Maverick correm

/etc/profile.d/*.sh

se presente, e se o shell do usuário for bash:

/etc/bash.bashrc

Para o ambiente do usuário, existe uma matriz confusa específica para o shell e se é considerado um "shell de login". Se o shell for bash:

   ~/.bash_profile
          The personal initialization file, executed for login shells
   ~/.bashrc
          The individual per-interactive-shell startup file

para sh / dash:

$HOME/.profile

para zsh, eu nem vou tentar entender isso .

msw
fonte
5

Conforme recomendado em https://help.ubuntu.com/community/EnvironmentVariables :

  1. Variáveis ​​de ambiente globais destinadas a afetar todos os usuários devem entrar /etc/environment.

  2. As variáveis ​​de ambiente específicas do usuário devem ser definidas ~/.pam_environment.

Evite os arquivos profile e rc para definir variáveis ​​de ambiente no Ubuntu. Eles me causaram mais dores de cabeça do que valem.

Isso é mais fácil dizer do que fazer, no entanto;)

É possível que você encontre a mesma lacuna de configuração que existia para mim. Veja a solução alternativa para a casa criptografada abaixo.

Meu ~/.pam_environment:

PATH            DEFAULT=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:${HOME}/bin
IDEA_JDK        DEFAULT=${HOME}/Applications/jdk

Por que o caminho estático feio? ${PATH}não funcionaria para mim. Eu bloqueei meu login várias vezes, tentando contorná-lo, por isso continuo com a cópia estática feia dos padrões :)

Solução alternativa para pastas domésticas criptografadas

Nas versões do Ubuntu até o Precise 12.04 Beta 2, inclusive, se você estiver usando um diretório inicial criptografado, precisará modificá /etc/pam.d/common-session-lo para carregá-lo ~/.pam_environment. Aparentemente, esta solução funciona para versões anteriores, mas ainda não a testei.

Guenther Montag (g-montag) escreveu em 19/08/2010:

Este parece ser um problema com diretórios pessoais criptografados. Eu adicionei

sessão necessária pam_env.so

no final de /etc/pam.d/common-session e agora ~ / .pam_environment é lido. Em outro sistema sem diretórios pessoais criptografados (também 10.04), a solução alternativa não é necessária. Talvez no meu caso o sistema tente ler ~ / .pam_environment antes de ser descriptografado.

Adaptado da minha resposta no Superusuário: https://superuser.com/a/408373/66856

Alain O'Dea
fonte
Isso ainda está errado: ${HOME}também não funcionará. Não há expansão no .pam_environment.
detly 7/08/14
2
@detly há expansão .pam_environment, mas HOMEnão é definido tão cedo normalmente. Se essa linha tivesse sido lida DEFAULT=${PATH}/Applications/jdk, você teria visto o valor PATHinserido nela.
muru