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:
HOMEes su directorio personal.USERes el nombre de su cuenta.SHELLes su intérprete de comandos de inicio de sesión configurado.PWDindica el directorio de trabajo actual.PATHcontiene los directorios donde se buscan comandos, separados por dos puntos.TERMdescribe 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.



