Variáveis de Ambiente Linux: Guia Completo para Iniciantes e Avançados

No universo Linux, as variáveis de ambiente assumem diversas formas. Este guia detalha como visualizá-las, criá-las para acessos locais e remotos, e assegurar sua persistência após reinicializações.

Entendendo o Funcionamento das Variáveis de Ambiente

Ao iniciar uma janela de terminal, a interface de linha de comando (shell) que opera dentro dela, emprega um conjunto de variáveis para sua configuração correta. Estas variáveis garantem que as informações necessárias estejam acessíveis à janela do terminal e ao shell. Em conjunto, elas definem o ambiente dentro da janela, incluindo a aparência do prompt de comando, sendo, por isso, denominadas variáveis de ambiente.

Existem variáveis de ambiente de alcance global, válidas para todo o sistema, e outras específicas para cada sessão de usuário. Há ainda um terceiro tipo, configuradas diretamente no shell. Informações como localização, fuso horário, configurações de teclado, diretórios de busca para comandos e editor padrão são exemplos armazenados em variáveis de ambiente do shell.

A seguir, exploraremos como visualizar as variáveis de ambiente do seu sistema, criar suas próprias e torná-las acessíveis a processos filhos, além de garantir sua persistência após reiniciar o sistema.

Herança e Ambientes

Quando um shell é iniciado, ele passa por um processo de inicialização, durante o qual as variáveis de ambiente são lidas e o ambiente do shell é definido.

Quando um programa ou comando é executado a partir desse shell (processo filho), ele herda o ambiente do shell original (processo pai). É importante notar que é possível criar variáveis que não são incorporadas ao ambiente e, portanto, não serão herdadas por processos filhos.

Se o processo filho for um shell, ele será inicializado a partir de seu próprio conjunto de variáveis, sem herdar as configurações do shell pai. Por exemplo, alterações no prompt de comando do shell pai não serão refletidas no shell filho.

Variáveis de Ambiente Globais

Por convenção, os nomes das variáveis de ambiente são escritos em letras maiúsculas. Algumas variáveis de ambiente globais comuns e seus valores são:

SHELL: O nome do shell em uso ao abrir um terminal, geralmente bash na maioria das distribuições Linux.
TERM: O tipo de terminal de hardware que está sendo emulado pela janela do terminal.
USER: O nome do usuário atual do sistema.
PWD: O caminho para o diretório de trabalho atual.
OLDPWD: O diretório em que estava antes de mudar para o diretório atual.
LS_COLORS: A lista de códigos de cores que o comando ls usa para destacar diferentes tipos de arquivos.
MAIL: O caminho para a caixa de correio do usuário, caso o sistema de e-mail esteja configurado (o que não é comum por padrão).
PATH: Uma lista de diretórios que o shell procura para encontrar executáveis de comandos.
LANG: As configurações de idioma, localização e codificação de caracteres.
HOME: O diretório inicial do usuário atual.
_: A variável que armazena o último comando digitado.

Podemos usar o comando echo para exibir o valor de uma variável de ambiente no terminal. Para acessar o valor, adicione um cifrão ($) antes do nome da variável.

Uma dica útil é usar a autocompletar com a tecla Tab para preencher o nome das variáveis. Após digitar algumas letras do nome, pressione Tab para que o shell complete o restante, ou, em caso de múltiplos resultados, digite mais letras para diferenciá-la.

echo $SHELL
echo $LANG
echo $HOME
echo $PWD

Para criar variáveis de ambiente globais, é preciso adicioná-las ao arquivo /etc/environment. Para isso, use o comando sudo para editar o arquivo com um editor de texto:

sudo gedit /etc/environment

Para adicionar uma variável, digite seu nome, um sinal de igual (=), e o valor. Evite espaços antes ou depois do sinal de igual. O nome da variável pode conter letras, sublinhados (_), ou números, mas não pode começar com um número. Se o valor contiver espaços, coloque-o entre aspas (” “).

Salve o arquivo e encerre a sessão, voltando a entrar. Use o comando echo para verificar se a nova variável existe e armazena o valor definido:

echo $WEBSITE

Por ser uma variável global, a usuária “mary” poderá referenciar a variável WEBSITE após seu login:

echo $WEBSITE

Para visualizar todas as variáveis de ambiente, use o comando printenv. Para facilitar a leitura da saída, é recomendado combiná-lo com sort e less:

printenv | sort | less

A lista organizada de variáveis de ambiente será exibida em less.

É possível filtrar a saída com grep para buscar por variáveis de ambiente relacionadas a um tema específico:

printenv | grep GNOME

Variáveis de Ambiente do Shell

As seguintes variáveis de ambiente são usadas pelo bash para registrar e definir seu comportamento e funcionalidade. Algumas variáveis são atualizadas conforme você usa o terminal. Por exemplo, a variável COLUMNS se ajusta à largura da janela do terminal.

BASHOPTS: Opções de linha de comando usadas na inicialização do bash.
BASH_VERSION: Número da versão do bash.
BASH_VERSINFO: A versão do bash em formato numérico.
COLUMNS: Largura atual da janela do terminal.
DIRSTACK: Diretórios adicionados à pilha de diretórios pelo comando pushd.
HISTFILESIZE: Número máximo de linhas no arquivo de histórico.
HISTSIZE: Número de linhas do histórico na memória.
HOSTNAME: Nome do host do computador.
IFS: O separador de campo interno (padrão: espaço) usado na linha de comando.
PS1: A definição do prompt de comando principal, que pode incluir sequências de escape para representar informações como nome do usuário, host, diretório atual e hora.
PS2: Definição do prompt de comando secundário, exibido quando um comando se estende por várias linhas (padrão: >).
SHELLOPTS: Opções de shell definidas com o comando `set`.
UID: O identificador de usuário atual.

Exemplos de como visualizar algumas dessas variáveis:

echo $BASH_VERSION
echo $HOSTNAME
echo $COLUMNS
echo $HISTFILESIZE
echo $UID

As sequências de escape podem ser usadas nas definições de prompt de comando:

\t: Hora atual (HH:MM:SS).
\d: Data atual (dia da semana, mês, data).
\n: Quebra de linha.
\s: Nome do seu shell.
\W: Nome do seu diretório de trabalho atual.
\w: Caminho para o diretório atual.
\u: Nome de usuário.
\h: Nome do host do computador.
\#: Número do comando no shell.
\$: Caractere final do prompt ($ para usuário comum, # para root).

A definição da variável de ambiente PS1 está armazenada no seu arquivo .bashrc.

Criando Variáveis de Ambiente de Sessão

Para criar variáveis de ambiente para uso pessoal, adicione-as ao final do arquivo .bashrc. Se deseja que estas variáveis estejam acessíveis também em sessões remotas (como conexões SSH), adicione-as também ao arquivo .bash_profile.

O formato da definição é o mesmo para ambos os arquivos. Para adicionar uma definição ao .bashrc, execute o seguinte comando no seu diretório inicial:

gedit .bashrc

Adicione uma variável de ambiente, como INHERITED_VAR, não se esquecendo de usar a palavra export no início da linha:

Após salvar e fechar o arquivo, encerre a sessão e volte a entrar, ou faça o shell reler o arquivo usando o comando . .bashrc:

. .bashrc

Agora, crie uma variável de ambiente diretamente na linha de comando:

LOCAL_VAR="This session only"

Use echo para visualizar as variáveis, demonstrando que ambas estão acessíveis:

echo $LOCAL_VAR
echo $INHERITED_VAR

Note que a definição de INHERITED_VAR inclui a palavra export. Isso garante que a variável será herdada por processos filhos. Ao iniciar outro shell com bash, verifique as variáveis:

bash
echo $LOCAL_VAR
echo $INHERITED_VAR

Como visto, INHERITED_VAR está disponível no shell filho, mas LOCAL_VAR não. Obtemos apenas uma linha em branco. Apesar de “exportar” tornar a variável acessível a processos filhos, INHERITED_VAR não é uma variável global. Por exemplo, a usuária mary não pode acessá-la:

echo $INHERITED_VAR

Use exit para encerrar a sessão do shell filho:

exit

Os ambientes herdados também afetam scripts. Considere o seguinte script que exibe os valores de três variáveis:

#!/bin/bash

echo "WEBSITE" $WEBSITE
echo "LOCAL_VAR" $LOCAL_VAR
echo "INHERITED_VAR" $INHERITED_VAR

Este script, salvo como envtest.sh, foi tornado executável com o comando:

chmod +x envtest.sh

Ao executá-lo, note que ele consegue acessar duas das três variáveis:

./envtest.sh

O script tem acesso à variável global WEBSITE e à variável exportada INHERITED_VAR. Não consegue acessar LOCAL_VAR, mesmo estando no mesmo shell onde foi criada.

Se necessário, podemos exportar uma variável da linha de comando. Para demonstrar, vamos exportar LOCAL_VAR e executar o script novamente:

export LOCAL_VAR
./envtest.sh

A variável foi adicionada ao ambiente do shell atual e, portanto, visível para o script, que também consegue referenciar a variável.

Conexões Remotas

Variáveis de ambiente globais estão acessíveis em sessões remotas, mas, para que suas variáveis locais estejam disponíveis remotamente, inclua-as no arquivo .bash_profile. É possível definir a mesma variável em ambos .bashrc e .bash_profile, com valores diferentes. Scripts podem utilizar isso para ajustar o comportamento em acessos locais ou remotos.

(O arquivo .profile também pode conter definições de variáveis de ambiente, mas ele não é lido se .bash_profile existir. Portanto, usar .bash_profile é a forma mais segura e compatível com o bash.)

Para editar .bash_profile, use gedit:

gedit .bash_profile

Adicione a mesma variável de ambiente com o mesmo valor usado anteriormente.

Salve as alterações e feche o editor.

Em outro computador, faça uma conexão SSH com a máquina de teste:

ssh [email protected]

Uma vez conectado, execute o script novamente:

./envtest.sh

O arquivo .bash_profile foi lido na inicialização do login remoto, e a variável INHERITED_VAR está disponível tanto para o usuário quanto para o script.

Removendo uma Variável de Ambiente

Para remover a definição de uma variável, use o comando unset. Removendo as definições das variáveis WEBSITE (global) e INHERITED_VAR (exportada), elas não estarão mais acessíveis na linha de comando ou em processos filhos:

unset WEBSITE
unset INHERITED_VAR
./envtest.sh
echo $WEBSITE

É importante notar que esta alteração só afeta a disponibilidade das variáveis globais na sua sessão atual. Outro usuário com sessão ativa ainda poderá acessar a sua instância da variável global, já que ela foi inicializada a partir do arquivo /etc/environment durante o login e é independente de outras cópias.

Por exemplo, a usuária “mary” ainda pode acessar a variável WEBSITE, mesmo que o usuário “dave” a tenha removido em sua sessão:

echo $WEBSITE

Utilização das Variáveis de Ambiente

Variáveis de ambiente permitem que scripts e aplicativos adaptem seu comportamento. Elas podem armazenar configurações ou pequenos conjuntos de dados. Por exemplo, um script pode definir um valor que pode ser referenciado por outros scripts, sem necessidade de armazenamento em arquivo.