Variáveis de ambiente no Linux

ShellBeginner
Pratique Agora

Introdução

Os programas frequentemente precisam de pequenas informações de configuração: um diretório pessoal, um idioma, um caminho de busca ou uma configuração de aplicativo. Os processos do Linux recebem muitos desses valores por meio de um ambiente, que é uma coleção de strings nomeadas.

Neste laboratório, você vai construir esse conceito por etapas. Primeiro, criará uma variável que pertence apenas ao shell atual. Depois, exportará uma variável para os processos filhos, inspecionará variáveis padrão, estenderá o PATH e fará com que as configurações apareçam em futuras sessões do Zsh. Cada etapa gera um arquivo ou resultado de comando observável, para que você possa verificar o que o shell realmente fez.

Criar e expandir uma variável do shell

Nesta etapa, você criará uma variável do shell e observará como as aspas afetam a expansão.

Uma variável do shell associa um nome a um valor dentro do shell atual. A sintaxe de atribuição não permite espaços ao redor de =. Colocar o valor entre aspas preserva o espaço interno:

cd /home/labex/project/environment-lab
course_name="Linux for Noobs"

Adicionar $ antes do nome faz o shell expandir a variável para o seu valor:

echo "$course_name"

As aspas duplas permitem a expansão e mantêm o resultado como um único argumento. As aspas simples preservam o cifrão literalmente. Compare os dois casos:

printf 'double: %s\n' "$course_name"
printf 'single: %s\n' '$course_name'

Salve o valor expandido como um resultado observável:

printf 'course=%s\n' "$course_name" > shell-variable.txt
cat shell-variable.txt

Essa variável existe apenas no shell atual, a menos que seja exportada.

Observar a herança em processos filhos

Nesta etapa, você comparará uma variável comum do shell com uma variável exportada dentro de um processo filho.

Cada comando é executado em um processo. Um processo filho recebe as variáveis de ambiente exportadas pelo processo pai, mas não recebe as variáveis comuns do shell.

Volte ao diretório de trabalho e crie uma variável de cada tipo:

cd /home/labex/project/environment-lab
local_message="visible only in this shell"
export SHARED_MESSAGE="visible in child processes"

Crie um pequeno processo filho do Bash que exiba os dois nomes. O marcador de heredoc entre aspas impede que o shell atual expanda as variáveis enquanto grava o script:

cat > inspect-child.sh <<'EOF'
#!/bin/bash
printf 'local=%s\n' "${local_message:-<missing>}"
printf 'shared=%s\n' "${SHARED_MESSAGE:-<missing>}"
EOF
chmod +x inspect-child.sh

Execute o script, redirecione a saída para um arquivo e depois exiba o arquivo. Manter essas ações em comandos separados deixa claro qual ação executa o processo filho e qual ação inspeciona o resultado salvo:

./inspect-child.sh > child-environment.txt
cat child-environment.txt

A variável comum deve aparecer como <missing>, enquanto SHARED_MESSAGE deve ser herdada. Confirme que o nome exportado está presente no ambiente:

env | grep '^SHARED_MESSAGE='

Inspecionar variáveis de ambiente padrão

Nesta etapa, você inspecionará variáveis padrão que descrevem sua conta, o diretório de trabalho, o terminal e o caminho de busca de comandos.

Os shells do Linux normalmente fornecem variáveis padrão úteis:

  • HOME é o seu diretório pessoal.
  • USER é o nome da sua conta.
  • SHELL é o seu shell de login configurado.
  • PWD acompanha o diretório de trabalho atual.
  • PATH lista os diretórios usados para buscar comandos, separados por dois-pontos.
  • TERM descreve os recursos do terminal para programas interativos.

Exiba valores selecionados com printenv, que lê variáveis exportadas pelo nome:

printenv HOME USER SHELL PWD TERM

O PATH é mais fácil de ler com uma entrada por linha. Passe o valor para tr para substituir cada dois-pontos por uma quebra de linha:

printf '%s\n' "$PATH" | tr ':' '\n'

Crie um relatório estável a partir de variáveis cujos valores esperados são conhecidos neste laboratório:

cd /home/labex/project/environment-lab
printf 'HOME=%s\nUSER=%s\n' "$HOME" "$USER" > standard-environment.txt
cat standard-environment.txt

Estender o PATH com um comando pessoal

Nesta etapa, você adicionará um diretório pessoal de executáveis ao PATH e executará um comando pelo nome a partir de outro diretório.

Quando você digita um comando sem uma barra, o shell pesquisa os diretórios do PATH da esquerda para a direita. Você pode adicionar um diretório pessoal de executáveis sem substituir o caminho de busca existente.

Crie um comando chamado course-status:

mkdir -p "$HOME/bin"
cat > "$HOME/bin/course-status" <<'EOF'
#!/bin/bash
echo "Linux learning environment is ready"
EOF
chmod +x "$HOME/bin/course-status"

Adicione o diretório ao PATH atual. Manter $PATH preserva o acesso aos comandos padrão:

export PATH="$PATH:$HOME/bin"

Peça ao shell para informar qual arquivo ele executará e depois execute o comando a partir de outro diretório:

command -v course-status
cd /tmp
course-status

Salve a saída no diretório de trabalho do laboratório:

course-status > /home/labex/project/environment-lab/path-command.txt

Persistir configurações para futuras sessões do Zsh

Nesta etapa, você configurará futuras sessões do Zsh e distinguirá a configuração persistente do estado do shell atual.

A exportação altera o processo atual e seus futuros processos filhos; ela não edita um arquivo de configuração. Uma configuração aparece em terminais posteriores somente quando um arquivo de inicialização a recria. O Terminal do LabEx usa o Zsh, cujo arquivo de inicialização interativo é ~/.zshrc.

Adicione um bloco claramente identificado. Cada linha export recria uma configuração de ambiente sempre que um novo Zsh interativo é iniciado. Nesta versão para iniciantes, o arquivo de inicialização permanece intencionalmente direto: preserve o PATH existente e depois adicione o diretório pessoal ao final.

cat >> "$HOME/.zshrc" <<'EOF'
## LABEX_ENV_LAB_START
export PROJECT_DIR="$HOME/project"
export PATH="$PATH:$HOME/bin"
## LABEX_ENV_LAB_END
EOF

O comando source lê um arquivo no shell atual. Recarregue .zshrc agora para usar as configurações sem fechar o Terminal:

source "$HOME/.zshrc"

Confirme que a variável recarregada está disponível:

printf 'PROJECT_DIR=%s\n' "$PROJECT_DIR"

Você deve ver PROJECT_DIR=/home/labex/project. Também pode iniciar um novo processo do Zsh para provar que uma sessão futura carrega as mesmas configurações. Em zsh -ic, -i solicita um shell interativo para que .zshrc seja lido, e -c fornece o comando que esse shell deve executar. Redirecione as duas linhas de saída para future-shell.txt e depois inspecione o arquivo:

zsh -ic 'printf "PROJECT_DIR=%s\n" "$PROJECT_DIR"; command -v course-status' > /home/labex/project/environment-lab/future-shell.txt
cat /home/labex/project/environment-lab/future-shell.txt

A primeira linha deve mostrar /home/labex/project; a segunda deve mostrar /home/labex/bin/course-status.

Por fim, aprenda a diferença entre o estado atual e a configuração persistente. Crie e remova uma variável de ambiente temporária:

export TEMP_NOTE="remove me"
printenv TEMP_NOTE
unset TEMP_NOTE
printenv TEMP_NOTE

O printenv final não produz nenhuma saída e retorna um status diferente de zero, porque o nome não existe mais. unset remove o nome do shell atual. Se um nome ainda estiver definido em um arquivo de inicialização, um shell futuro o recriará até que essa linha de configuração seja removida.

Resumo

Você observou os três mecanismos que costumam ser confundidos: uma variável do shell pertence a um único shell, export passa um valor para processos filhos e um arquivo de inicialização recria configurações em shells futuros. Você também inspecionou variáveis de ambiente padrão, estendeu o PATH sem perder as entradas existentes, verificou a busca de comandos e removeu o estado temporário com unset.