Variables de entorno en Linux: env, export y las más importantes
Variables de entorno son pares clave=valor que el sistema operativo mantiene en memoria y pone a disposición de todos los procesos en ejecución. Controlan el comportamiento del shell, de los programas y de los scripts — desde dónde el sistema busca ejecutables (PATH) hasta el idioma que muestran los programas (LANG).
Comprender las variables de entorno es fundamental para administrar servidores, escribir scripts robustos y aprobar certificaciones como LPIC-1 (tópico 105).
Listar variables de entorno
Existen tres comandos para listar variables, cada uno con un alcance diferente:
# env — lista apenas variáveis de ambiente exportadas
env
# printenv — igual ao env, mas pode filtrar por nome
printenv
printenv PATH # mostra só a variável PATH
printenv HOME USER # múltiplas variáveis de uma vez
# set — lista variáveis de ambiente + variáveis locais do shell + funções
set
La diferencia práctica: env y printenv muestran solo lo que los procesos hijos heredan. set muestra todo, inclusive variables temporales que existen solo en la sesión actual del shell.
Variables de entorno más importantes
| Variable | Contenido | Ejemplo |
|---|---|---|
PATH | Directorios donde el shell busca ejecutables | /usr/local/bin:/usr/bin:/bin |
HOME | Directorio home del usuario actual | /home/joao |
USER | Nombre del usuario conectado | joao |
SHELL | Shell predeterminado del usuario | /bin/bash |
LANG | Idioma y codificación predeterminados | pt_BR.UTF-8 |
PWD | Directorio de trabajo actual | /var/www/html |
OLDPWD | Directorio anterior (antes del último cd) | /home/joao |
EDITOR | Editor de texto predeterminado del sistema | vim |
TERM | Tipo de terminal en uso | xterm-256color |
PS1 | Formato del prompt del shell | \u@\h:\w\$ |
UID | ID numérico del usuario | 1000 |
HOSTNAME | Nombre del host de la máquina | servidor01 |
Crear y exportar variables
Variable local (solo existe en la sesión actual del shell)
# Cria variável local — processos filhos NÃO herdam
NOME="João"
echo $NOME # João
bash -c 'echo $NOME' # (vazio — filho não herda)
Variable exportada (procesos hijos heredan)
# export torna a variável disponível para processos filhos
export NOME="João"
bash -c 'echo $NOME' # João — filho herda!
# Criar e exportar em uma linha só
export DB_HOST="localhost"
export DB_PORT=5432
# Ver se uma variável está exportada
export -p | grep NOME
Variable para un solo comando (sin afectar el entorno actual)
# Passa a variável APENAS para aquele comando — não altera a sessão
LANG=en_US.UTF-8 man ls # manual em inglês
# Muito útil para scripts e testes
NODE_ENV=production npm start
DEBUG=* node app.js
PYTHONDONTWRITEBYTECODE=1 python script.py
# Múltiplas variáveis antes do comando
LANG=en_US DB_HOST=prod ./meu_script.sh
El comando env
Listar variables filtradas
# Ver todas as variáveis de ambiente
env
# Filtrar por padrão
env | grep PATH
env | grep -i db # busca case-insensitive
Ejecutar comando con entorno modificado
# Sobrescrever PATH para um único comando
env PATH=/usr/local/bin:/usr/bin which python
# Adicionar variável sem afetar o shell atual
env MYSQL_HOST=db.prod.com ./backup.sh
Ejecutar con entorno limpio (-i)
La bandera -i (o --ignore-environment) inicia el comando con un entorno completamente vacío — útil para pruebas y para garantizar que ninguna variable del entorno del usuario afecte la ejecución:
# Roda bash com ambiente completamente limpo
env -i bash
# Roda script com apenas as variáveis necessárias
env -i HOME=/tmp PATH=/usr/bin:/bin ./script.sh
# Ver quantas variáveis existem normalmente vs. ambiente limpo
env | wc -l # ~30–50 variáveis normalmente
env -i env | wc -l # 0
Shebang con env en scripts
Usar /usr/bin/env en el shebang en lugar de la ruta directa del intérprete hace que el script sea más portable — env encuentra el intérprete en el PATH del sistema, dondequiera que esté instalado:
#!/usr/bin/env python3
# Funciona em qualquer sistema onde python3 está no PATH
#!/usr/bin/env bash
# Melhor que #!/bin/bash em sistemas onde bash pode estar em outro local
#!/usr/bin/env node
# Comum em scripts Node.js
Variables permanentes: dónde definir
Las variables creadas en la terminal desaparecen cuando la sesión termina. Para hacerlas permanentes, elige el archivo adecuado según el alcance deseado:
| Archivo | Alcance | Cuándo se lee |
|---|---|---|
~/.bashrc | Usuario actual | En cada shell interactivo (no-login) |
~/.bash_profile o ~/.profile | Usuario actual | Login vía terminal o SSH |
/etc/environment | Sistema entero | Login de cualquier usuario (PAM) |
/etc/profile | Sistema entero | Login de cualquier usuario (shell login) |
/etc/profile.d/*.sh | Sistema entero | Login de cualquier usuario |
# Adicionar variável permanente para o usuário atual
echo 'export EDITOR=vim' >> ~/.bashrc
echo 'export JAVA_HOME=/usr/lib/jvm/java-17' >> ~/.bashrc
source ~/.bashrc # Recarrega sem precisar fechar o terminal
# Adicionar ao PATH do usuário (sem sobrescrever o PATH existente)
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
# Variável para todos os usuários do sistema
echo 'EDITOR=vim' | sudo tee -a /etc/environment
# Verificar se foi aplicado após recarregar
source ~/.bashrc
echo $EDITOR
Manipular el PATH
El PATH es la variable más importante del sistema — define dónde el shell busca ejecutables. El orden de los directorios importa: el shell usa el primer ejecutable que encuentre.
# Ver o PATH atual (separado por :)
echo $PATH
# /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# Adicionar diretório no início do PATH (maior prioridade)
export PATH="/opt/meu_programa/bin:$PATH"
# Adicionar no final (menor prioridade)
export PATH="$PATH:/opt/meu_programa/bin"
# Verificar qual executável o shell vai usar
which python3
type python3
# Ver todos os executáveis com aquele nome no PATH
type -a python
Eliminar variables
# unset remove a variável completamente
unset NOME
echo $NOME # (vazio)
# Remover do export (mantém como local)
export -n NOME
Variables en scripts
#!/usr/bin/env bash
# Boas práticas em scripts
set -euo pipefail # sai em erro, trata variáveis não definidas, propaga erros em pipes
# Ler variável de ambiente com valor padrão
DB_HOST="${DB_HOST:-localhost}"
DB_PORT="${DB_PORT:-5432}"
# Checar se variável obrigatória está definida
if [ -z "${API_KEY:-}" ]; then
echo "ERRO: API_KEY não definida" >&2
exit 1
fi
# Exibir variáveis definidas para debug
env | sort | grep "^DB_"
Archivos .env y dotenv
Proyectos modernos (Node.js, Python, Docker) usan archivos .env para centralizar variables de configuración:
# Arquivo .env típico
DB_HOST=localhost
DB_PORT=5432
DB_NAME=meuapp
SECRET_KEY=chave-super-secreta
# Carregar no shell manualmente
export $(grep -v '^#' .env | xargs)
# Com Docker
docker run --env-file .env minha_imagem
# Com Docker Compose (lê .env automaticamente)
# Mas também pode definir explicitamente:
# env_file:
# - .env
Referencia rápida
# Listar todas as variáveis exportadas
env | sort
# Criar variável local
VARIAVEL="valor"
# Exportar para processos filhos
export VARIAVEL="valor"
# Variável só para um comando
VAR=valor comando
# Ambiente limpo
env -i comando
# Remover variável
unset VARIAVEL
# Tornar permanente (usuário)
echo 'export VARIAVEL="valor"' >> ~/.bashrc && source ~/.bashrc
# Ver de onde vem um executável
which python3
type -a python3
# Adicionar ao PATH permanentemente
echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc
Eso fue solo una pieza. El curso enseña el camino completo — desde tu primer comando hasta el día del examen.