Variables de entorno en Linux

ShellBeginner
Practicar Ahora

Introducción

Los programas suelen necesitar pequeños datos de configuración: un directorio personal, un idioma, una ruta de búsqueda o un ajuste de la aplicación. Los procesos de Linux reciben muchos de estos valores mediante un entorno, que es una colección de cadenas con nombre.

En este laboratorio construirá este concepto por capas. Primero creará una variable que solo pertenece al shell actual; después exportará una variable a los procesos secundarios, inspeccionará variables estándar, ampliará PATH y hará que los ajustes aparezcan en futuras sesiones de Zsh. Cada paso deja un archivo o el resultado observable de un comando para que pueda comprobar qué hizo realmente el shell.

Crear y expandir una variable del shell

En este paso creará una variable del shell y observará cómo las comillas afectan a la expansión.

Una variable del shell asocia un nombre con un valor dentro del shell actual. La sintaxis de asignación no lleva espacios alrededor de =. Al poner entre comillas el valor, se conserva el espacio incluido:

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

Anteponer $ al nombre indica al shell que debe expandirlo a su valor:

echo "$course_name"

Las comillas dobles permiten la expansión y mantienen el resultado como un solo argumento. Las comillas simples conservan literalmente el signo de dólar. Compárelas:

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

Guarde el valor expandido como resultado observable:

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

Esta variable solo existe en el shell actual, a menos que la exporte.

Observar la herencia en procesos secundarios

En este paso comparará una variable normal del shell con una variable exportada dentro de un proceso secundario.

Cada comando se ejecuta en un proceso. Un proceso secundario recibe las variables de entorno exportadas por su proceso principal, pero no recibe las variables normales del shell.

Vuelva al espacio de trabajo y cree una variable de cada tipo:

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

Cree un proceso secundario pequeño de Bash que imprima ambos nombres. El marcador de heredoc entre comillas impide que el shell actual expanda las variables mientras escribe el 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

Ejecútelo, redirija la salida a un archivo y muestre el archivo. Mantener estas acciones como comandos separados deja claro qué acción ejecuta el proceso secundario y cuál inspecciona el resultado guardado:

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

La variable normal aparecerá como <missing>, mientras que SHARED_MESSAGE se heredará. Confirme que el nombre exportado está presente en el entorno:

env | grep '^SHARED_MESSAGE='

Inspeccionar variables de entorno estándar

En este paso inspeccionará variables estándar que describen su cuenta, el directorio de trabajo, el terminal y la ruta de búsqueda de comandos.

Los shells de Linux suelen proporcionar variables estándar útiles:

  • HOME es su directorio personal.
  • USER es el nombre de su cuenta.
  • SHELL es su intérprete de comandos de inicio de sesión configurado.
  • PWD indica el directorio de trabajo actual.
  • PATH contiene los directorios donde se buscan comandos, separados por dos puntos.
  • TERM describe las capacidades del terminal para los programas interactivos.

Muestre valores seleccionados con printenv, que lee las variables exportadas mediante su nombre:

printenv HOME USER SHELL PWD TERM

PATH es más fácil de leer si muestra una entrada por línea. Envíe el valor a tr para reemplazar cada dos puntos por un salto de línea:

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

Cree un informe estable a partir de variables cuyos valores esperados se conocen en este laboratorio:

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

Ampliar PATH con un comando personal

En este paso añadirá un directorio personal de ejecutables a PATH y ejecutará un comando por su nombre desde otro directorio.

Cuando introduce un comando sin una barra diagonal, el shell busca en los directorios de PATH, de izquierda a derecha. Puede añadir un directorio personal de ejecutables sin reemplazar la ruta de búsqueda existente.

Cree un comando llamado 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"

Añada el directorio al PATH actual. Conservar $PATH mantiene el acceso a los comandos estándar:

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

Pida al shell que indique qué archivo ejecutará y, después, ejecute el comando desde otro directorio:

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

Guarde su salida en el espacio de trabajo del laboratorio:

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

Hacer persistentes los ajustes para futuras sesiones de Zsh

En este paso configurará futuras sesiones de Zsh y distinguirá entre la configuración persistente y el estado del shell actual.

Exportar cambios afecta al proceso actual y a sus futuros procesos secundarios; no modifica ningún archivo de configuración. Un ajuste aparece en terminales posteriores solo cuando un archivo de inicio vuelve a crearlo. LabEx Terminal utiliza Zsh, cuyo archivo de inicio interactivo es ~/.zshrc.

Añada un bloque claramente marcado. Cada línea export vuelve a crear un ajuste del entorno cada vez que se inicia un Zsh interactivo nuevo. En esta versión para principiantes, el archivo de inicio se mantiene deliberadamente directo: conserva el PATH existente y añade al final el directorio personal.

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

El comando source lee un archivo en el shell actual. Vuelva a cargar .zshrc ahora para poder usar sus ajustes sin cerrar el terminal:

source "$HOME/.zshrc"

Confirme que la variable recargada está disponible:

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

Debería ver PROJECT_DIR=/home/labex/project. También puede iniciar un proceso nuevo de Zsh para demostrar que una sesión futura carga los mismos ajustes. En zsh -ic, -i solicita un shell interactivo para que se lea .zshrc, y -c proporciona el comando que ese shell debe ejecutar. Redirija sus dos líneas de salida a future-shell.txt y, después, inspeccione el archivo:

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

La primera línea debería mostrar /home/labex/project; la segunda debería mostrar /home/labex/bin/course-status.

Por último, aprenda la diferencia entre el estado actual y la configuración persistente. Cree y elimine una variable de entorno temporal:

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

El printenv final no produce ninguna salida y devuelve un estado distinto de cero porque el nombre ya no existe. unset elimina el nombre del shell actual. Si un nombre todavía está definido en un archivo de inicio, un shell futuro volverá a crearlo hasta que se elimine esa línea de configuración.

Resumen

Observó los tres mecanismos que suelen confundirse: una variable del shell pertenece a un solo shell, export transmite un valor a los procesos secundarios y un archivo de inicio vuelve a crear los ajustes en shells futuros. También inspeccionó variables de entorno estándar, amplió PATH sin perder las entradas existentes, verificó la búsqueda de comandos y eliminó el estado temporal con unset.