segunda-feira, 20 de fevereiro de 2012

Variáveis de ambiente no Ubuntu

A algum tempo atrás voltei a estudar android. Enquanto estudava, configurei algumas variáveis de ambiente como $ANDROID_HOME. Porém, lembro que tive que executar o comando source para carregar as alterações que acabara de fazer no arquivo /etc/profile.

Na época que fiz a configuração acima, conseguia executar os programas adb, android e etc.
Porém quando voltei a estudar android e fui executar os comandos novamente: pffffffmmm! Não funcionou.

Foi então que decidi entender um pouco melhor o funcionamento das variáveis de ambiente no Ubuntu.

Depois de ler a documentação disponível em Environment Variables entendi o que estava acontecendo.

Quando imprimia o valor da variável $ANDROID_HOME, o conteúdo aparecia normalmente no shell.
Porém quando imprimia o valor de $PATH, o conteúdo que concatenei (no caso android path) não aparecia.

O problema era o seguinte:
o arquivo /etc/profile é carregado quando efetuado um login no shell (via console, ssh ou DisplayManager - quando a sessão do desktop é carregada). Porém além de executar muitas coisas ali dentro, no final o script chama outro script: o /etc/bash.bashrc que é uma versão do arquivo ~/.bashrc para carregamento em escopo de sistema.

Quando abri o arquivo /etc/bash.bashrc havia outro export para PATH porém com menos endereços, e isso sobrescrevia o que eu já havia definido em /etc/profile.

Agora para uma documentação breve em português, deixo aqui um resumo sobre estes arquivos de configuração pois é bem provável que eu precise disso a qualqer momento novamente =P

Variáveis de ambiente com escopo de sessão

As variáveis com escopo de sessão são válidas apenas para o usuário o qual a configuração foi realizada. Abaixo seguem os arquivos com escopo de sessão:

  • ~/.profile - conforme a documentação é provavelmente o melhor local para configuração das variáveis de ambiente com escopo de sessão pois além de ser executado durante o login via shell também é executado durante a inicialização no modo gráfico (mas só durante processo de login no shell ou modo gráfico).
  • ~/.bash_profile - caso este arquivo exista, o mesmo será executado ao invés do ~/.profile, porém não terá influência no modo gráfico, o que pode ser ruim para a maioria dos usuários. (quero fazer uma experiência criando alguma variável de ambiente no ~/.profile mesmo existindo o ~/.bash_profile pra ver se a mesma não será criada).
  • ~/.bashrc - configurando as variáveis neste arquivo, as mesmas serão carregadas no modo gráfico ou modo texto, porém com o inconveniente de serem carregas sempre que o bash for executado, sendo portanto não tão bom em termos de performance.


Variáveis de ambiente com escopo de sistema

As variáveis com escopo de sistema valem para qualquer usuário que se autentique no sistema.
  • /etc/environment - não é um arquivo de script mas sim um arquivo para adicionar definições do tipo chave=valor.
  • /etc/profile - este arquivo é executado sempre que realiza-se o login via shell ou via modo gráfico (via DisplayManager).
  • /etc/bash.bashrc - conforme dito anteriormente é a versão do ~/.bashrc porém com escopo de sistema.

Conforme a documentação do próprio Ubuntu diz, utilizar os arquivos /etc/profile, /etc/bash.bashrc, ~/.bashrc, ~/.bash_profile ou ~/.profile não é recomendado. Pelo que entendi o mais recomendado é utilizar os arquivos /etc/environment ou ~/.pam_environment. Ambos arquivos que não são scripts, mas apenas arquivos com definições. (o .pam_environment é a versão do environment para escopo de sessão, mas não havia comentado pois no meu ambiente este arquivo nem existe).

Bom, por hoje é só. Talvez esse pouco que entendi possa ajudar outras pessoas algum dia. Enquanto isso vou tentando aprender um pouco mais sobre o ubuntu e quem sabe escrever posts melhores =P


Referências:
ubuntu documentation: EnvironmentVariables
https://help.ubuntu.com/community/EnvironmentVariables

Nenhum comentário:

Postar um comentário