Variáveis de ambiente
Nesta aula, você aprenderá sobre variáveis de ambiente no shell Bash: o que são, como consultá-las, como criar e exportar as suas próprias, além de entender o papel de variáveis importantes como PATH, HOME e USER. Também veremos como configurá-las automaticamente nos arquivos de inicialização do shell.
Variáveis de ambiente são um mecanismo fundamental do sistema operacional Linux e do shell Bash. Elas armazenam informações que afetam o comportamento de programas e processos em execução. Quando você abre um terminal, o shell já possui um conjunto de variáveis de ambiente definidas, como HOME, USER e PATH, que são usadas por comandos e aplicativos para encontrar arquivos, identificar o usuário e personalizar a experiência.
Nesta aula, vamos explorar o que são essas variáveis, como visualizá-las, como criar as suas próprias e como torná-las disponíveis para outros processos. Também discutiremos os arquivos de inicialização do shell, onde você pode definir variáveis de ambiente de forma persistente. Ao final, você terá uma compreensão sólida para gerenciar o ambiente do seu shell de forma eficiente.
PATH
A variável PATH é uma das mais importantes no Linux. Ela contém uma lista de diretórios, separados por dois-pontos (:), onde o shell procura por executáveis quando você digita um comando sem especificar o caminho completo. Por exemplo, quando você digita ls, o shell procura por um arquivo chamado ls em cada diretório listado em PATH, na ordem em que aparecem. Se o executável não for encontrado em nenhum desses diretórios, o shell retorna um erro de "comando não encontrado".
Para visualizar o valor atual do PATH, use o comando echo $PATH. Você verá algo como /usr/local/bin:/usr/bin:/bin (a ordem pode variar). É importante entender que a ordem dos diretórios importa: se dois diretórios contêm um executável com o mesmo nome, o shell usará o primeiro encontrado. Por isso, é comum colocar diretórios de scripts do usuário no início do PATH para sobrescrever comandos padrão.
# Ver o PATH atual
echo $PATH
# Adicionar um diretório ao PATH temporariamente (apenas para a sessão atual)
export PATH="/meu/novo/diretorio:$PATH"
# Verificar se o diretório foi adicionado
echo $PATHPara adicionar permanentemente um diretório ao PATH, você deve incluí-lo nos arquivos de inicialização do shell, como veremos adiante. Uma prática comum é adicionar o diretório ~/bin (onde você pode colocar scripts pessoais) ao PATH.
HOME, USER
A variável HOME armazena o caminho do diretório inicial do usuário atual. Por exemplo, para o usuário aluno, HOME geralmente é /home/aluno. O shell a utiliza quando você usa o atalho ~ (til) para se referir ao diretório inicial. Muitos programas também usam HOME para localizar arquivos de configuração, como ~/.bashrc.
A variável USER contém o nome do usuário logado. Ela é usada por scripts e programas para personalizar saídas ou para criar arquivos específicos do usuário. Por exemplo, um script pode criar um diretório de backup em /tmp/$USER.
# Exibir o valor de HOME e USER
echo "Meu diretório home: $HOME"
echo "Meu usuário: $USER"
# Usar HOME em um comando
ls $HOME
# O mesmo que: ls ~Essas variáveis são definidas automaticamente pelo sistema no login, mas você pode sobrescrevê-las em sua sessão (embora não seja recomendado, pois pode quebrar a funcionalidade de muitos programas).
export e env
No Bash, quando você define uma variável simplesmente com NOME=valor, ela é uma variável de shell, visível apenas no shell atual e em seus processos filhos? Na verdade, por padrão, variáveis definidas dessa forma não são passadas para os processos filhos. Para torná-las disponíveis para processos filhos (como scripts ou programas executados a partir do shell), você deve usar o comando export.
O comando export marca uma variável para ser exportada para o ambiente de qualquer processo filho. Por exemplo, se você definir MINHA_VAR="olá" e depois executar um script, esse script não verá a variável, a menos que você a exporte. Já o comando env é usado para exibir todas as variáveis de ambiente atuais ou para executar um comando com um ambiente modificado temporariamente.
# Definir uma variável sem exportar
MINHA_VAR="olá"
# Executar um comando que tenta acessá-la (não funcionará)
sh -c 'echo $MINHA_VAR' # saída vazia
# Exportar a variável
export MINHA_VAR
# Agora o comando filho a vê
sh -c 'echo $MINHA_VAR' # saída: olá
# Usar env para listar todas as variáveis de ambiente
envAlém disso, você pode usar env para definir variáveis temporariamente em um comando específico: env NOME=valor comando. Isso é útil quando você quer passar uma variável sem afetar a sessão atual.
Arquivos de inicialização
Quando você inicia uma sessão de terminal, o Bash lê alguns arquivos de inicialização que podem definir variáveis de ambiente, aliases, funções e outras configurações. Os principais são /etc/profile (para todos os usuários), ~/.bash_profile, ~/.bash_login e ~/.profile (para o usuário). Para shells interativos não-login (como abrir um novo terminal em uma interface gráfica), o Bash lê ~/.bashrc. Em muitas distribuições, ~/.profile ou ~/.bash_profile incluem a leitura do .bashrc.
Para adicionar uma variável de ambiente permanentemente, você deve adicionar a linha export NOME=valor no arquivo apropriado. Por exemplo, para adicionar ~/bin ao PATH, você pode adicionar export PATH="$HOME/bin:$PATH" ao seu ~/.bashrc. Depois de editar o arquivo, você precisa recarregá-lo com source ~/.bashrc ou abrir um novo terminal.
# Exemplo de adição ao ~/.bashrc
echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc
# Recarregar o arquivo
source ~/.bashrc
# Verificar se o diretório foi adicionado
echo $PATHÉ importante entender a diferença entre shell de login e não-login para saber onde colocar suas configurações. Em geral, para configurações de ambiente, o ~/.bashrc é o lugar mais comum, pois é lido em todas as sessões interativas do Bash.
Boas práticas e observações finais
- Sempre use
exportao definir variáveis que devem ser passadas a processos filhos. - Evite sobrescrever variáveis existentes como
PATHsem incluir o valor antigo ($PATH). - Use nomes de variáveis em MAIÚSCULAS por convenção, para diferenciá-las de variáveis locais do script.
- Para remover uma variável, use
unset NOME. - Teste suas alterações em uma sessão temporária antes de modificar permanentemente os arquivos de inicialização.
Referências
- Bash Manual: Shell Variables
- Linux man page: environ(7)
- Bash Manual: Bash Startup Files
- Linux man page: env(1)
- Advanced Bash-Scripting Guide: Environment Variables
- ShellCheck - find bugs in your shell scripts
Exercícios
Qual comando você usaria para exibir o valor da variável de ambiente
LANG? Escreva o comando e explique o que ele faz.✓ Resposta: O comando éecho $LANG. Ele usa o comandoechopara imprimir o valor da variávelLANGno terminal. O prefixo$faz a expansão da variável, ou seja, o shell substitui$LANGpelo valor armazenado.Como você adicionaria o diretório
/opt/meuapp/binao início do PATH, de forma temporária, apenas para a sessão atual? Escreva o comando.✓ Resposta:export PATH="/opt/meuapp/bin:$PATH". Isso redefine a variávelPATHcom o novo diretório no início, mantendo o valor antigo (referenciado por$PATH) após os dois-pontos. O comandoexportgarante que a variável seja passada aos processos filhos.Crie uma variável chamada
SAUDACAOcom o valor"Olá, mundo!"e exporte-a. Em seguida, escreva um comando que execute um subshell e imprima o valor dessa variável.✓ Resposta:
O comandoexport SAUDACAO="Olá, mundo!" sh -c 'echo $SAUDACAO'sh -cexecuta uma string como comando em um subshell, que herda as variáveis exportadas. A saída seráOlá, mundo!.Qual é a diferença entre um shell de login e um shell interativo não-login? Em qual arquivo você colocaria uma configuração que deve valer para todos os shells interativos?
✓ Resposta: Um shell de login é iniciado ao fazer login no sistema (por exemplo, via tty ou SSH), enquanto um shell interativo não-login é aberto em uma janela de terminal já dentro de uma sessão gráfica. O shell de login lê~/.bash_profile,~/.bash_loginou~/.profile; o shell não-login lê~/.bashrc. Para configurações que valem para todos os shells interativos, coloque-as em~/.bashrc(e, se necessário, inclua a leitura do.bashrcno.profile).Explique o que acontece se você executar
envsem argumentos e o que ele exibe.✓ Resposta: O comandoenvsem argumentos lista todas as variáveis de ambiente atuais, uma por linha, no formatoNOME=valor. Ele mostra as variáveis que estão exportadas para o ambiente do processo atual, incluindo as herdadas do shell pai e as definidas pelo usuário.