Introducción
En esta práctica de laboratorio, aprenderás los conceptos fundamentales para gestionar el entorno y la configuración de la shell en Linux. Comenzarás creando variables tanto locales como de entorno, utilizando comandos como echo, export y env para comprender las diferencias clave en su alcance y disponibilidad dentro de una sesión de shell.
Partiendo de esta base, explorarás cómo las variables y los alias se heredan en los shells hijos. También aprenderás a controlar la exportación automática de variables con la opción set -o allexport y a hacer que tus configuraciones personalizadas sean persistentes entre sesiones modificando el archivo .bashrc.
Crear y Diferenciar Variables Locales y de Entorno
En este paso, aprenderás a crear y gestionar variables de la shell. En una shell de Linux como Zsh, las variables se utilizan para almacenar información. Existen dos tipos principales: variables locales y variables de entorno.
- Una variable local (o variable de shell) solo está disponible dentro de la shell donde fue creada.
- Una variable de entorno está disponible no solo en la shell actual, sino también en cualquier proceso hijo iniciado desde esa shell.
Utilizaremos comandos como echo, export y env para trabajar con ellas. Todos los comandos se ejecutarán en la terminal.
Primero, vamos a crear una variable local. En tu terminal, que ya se encuentra en el directorio ~/project, escribe el siguiente comando para crear una variable llamada flower y asígnale el valor rose. Ten en cuenta que no debe haber espacios alrededor del signo igual (=).
flower=rose
Para verificar que la variable se ha creado, puedes usar el comando echo para imprimir su valor. El signo de dólar ($) antes del nombre de la variable le indica a la shell que sustituya la variable por su valor.
echo $flower
Deberías ver el valor de la variable impreso en la terminal:
rose
Ahora, comprobemos si esta variable local forma parte del entorno de la shell. El comando env enumera todas las variables de entorno. Podemos canalizar su salida a grep para buscar nuestra variable.
env | grep flower
Este comando no producirá ninguna salida. Este es el resultado esperado y confirma que flower es una variable local, no una variable de entorno.
A continuación, vamos a crear una variable de entorno. El proceso es similar, pero utilizamos el comando export. Este comando crea una variable y la marca para que se transmita a todos los procesos hijos de la shell actual. Vamos a crear una variable de entorno llamada nut con el valor almond.
export nut=almond
Verifiquémoslo con echo tal como hicimos antes.
echo $nut
El comando mostrará el valor de la variable nut:
almond
Ahora, comprobemos si existe en el entorno utilizando de nuevo el comando env.
env | grep nut
Esta vez, el comando encuentra y muestra la variable, confirmando que nut es una variable de entorno:
nut=almond
Has creado con éxito tanto una variable local como una de entorno, y has visto la diferencia fundamental en cómo las trata el entorno de la shell. Dejaremos estas variables configuradas para usarlas en los siguientes pasos.
Probar la Herencia de Variables y Alias en una Shell Hija
En este paso, explorarás cómo se comportan las variables y los alias cuando inicias una nueva shell desde la actual. Esta nueva shell se denomina "shell hija" y la shell original es la "shell padre". Este concepto es crucial para entender cómo se estructuran los entornos de shell y cómo se ejecutan los scripts. Probaremos si las variables flower y nut del paso anterior se transmiten, o se "heredan", por una shell hija.
Primero, identifiquemos el ID de Proceso (PID) de nuestra shell padre actual. Cada proceso en Linux tiene un PID único. Puedes verlo con el comando echo $$.
echo $$
La salida será un número, que es el PID de tu shell actual. Por ejemplo:
123
Ahora, inicia una shell hija simplemente escribiendo zsh y pulsando Enter. Esto crea un nuevo proceso de shell dentro del actual.
zsh
Ahora te encuentras en una nueva sesión de shell. Para confirmarlo, podemos usar el comando ps -f, que muestra información detallada de los procesos, incluido el ID del Proceso Padre (PPID).
ps -f
Observa la salida. Verás dos procesos zsh. El PID del nuevo proceso zsh debería tener un PPID que coincida con el PID de la shell padre que anotaste anteriormente.
UID PID PPID C STIME TTY TIME CMD
labex 123 1 0 10:00 pts/0 00:00:00 zsh
labex 456 123 0 10:01 pts/0 00:00:00 zsh
labex 457 456 0 10:01 pts/0 00:00:00 ps -f
En este ejemplo, la nueva shell (PID 456) es hija de la shell original (PPID 123).
Ahora, probemos las variables. En esta shell hija, intenta mostrar el valor de la variable local flower.
echo $flower
El comando no produce ninguna salida. Esto se debe a que las variables locales están limitadas a la shell en la que se crean y no son heredadas por las shells hijas.
A continuación, comprueba la variable de entorno nut.
echo $nut
Esta vez, la shell imprime el valor de la variable:
almond
Esto demuestra que las variables de entorno, a diferencia de las locales, son heredadas por las shells hijas.
Ahora, regresemos a la shell padre utilizando el comando exit.
exit
Ya estás de vuelta en tu shell original. Realicemos una prueba similar con un alias. Un alias es un atajo para un comando. Crea un alias llamado ldetc que ejecute ls -ld /etc.
alias ldetc='ls -ld /etc'
Verifica que el alias se haya creado escribiendo alias.
alias ldetc
Deberías ver la definición de tu alias:
ldetc='ls -ld /etc'
Ahora, prueba el alias ejecutándolo.
ldetc
El comando ejecutará ls -ld /etc y te mostrará los detalles del directorio /etc.
drwxr-xr-x 1 root root 4096 Oct 10 10:00 /etc
Ahora, abre otra shell hija para ver si el alias se hereda.
zsh
Dentro de la nueva shell hija, intenta usar el alias ldetc.
ldetc
Recibirás un mensaje de error, porque los alias, al igual que las variables locales, no son heredados por las shells hijas.
zsh: command not found: ldetc
Regresa a la shell padre.
exit
Finalmente, vamos a limpiar eliminando el alias de la shell padre con el comando unalias.
unalias ldetc
Verifica su eliminación intentando listarlo de nuevo.
alias ldetc
No se devuelve nada.
Este ejercicio te ha mostrado un principio clave del comportamiento de la shell: las variables de entorno son heredadas por los procesos hijos, pero las variables locales y los alias no lo son.
Controlar la Exportación Automática de Variables con set -o allexport
En este paso, aprenderás sobre una potente opción de la shell llamada allexport. Normalmente, cuando creas una variable, debes usar explícitamente el comando export para convertirla en una variable de entorno. Sin embargo, al habilitar la opción allexport, puedes indicar a la shell que exporte automáticamente cada nueva variable que definas. Esto puede ser un atajo conveniente, especialmente en scripts donde todas las variables deben estar disponibles para los subprocesos.
Las opciones de la shell son ajustes internos que cambian el comportamiento de tu shell. Puedes activarlas con set -o [nombre_opcion] y desactivarlas con set +o [nombre_opcion].
Primero, comprobemos el estado actual de la opción allexport. Puedes listar todas las opciones de la shell y filtrar por allexport usando grep.
set -o | grep allexport
Por defecto, esta opción está desactivada. La salida mostrará su estado como off:
allexport off
Ahora, activemos la opción allexport.
set -o allexport
Verifica que el ajuste haya cambiado ejecutando de nuevo el comando de comprobación.
set -o | grep allexport
Esta vez, la salida confirmará que la opción está en on:
allexport on
Con allexport habilitado, cualquier variable que crees se convertirá automáticamente en una variable de entorno. Probemos esto. Crea una nueva variable llamada truck sin usar el comando export.
truck=chevy
Ahora, comprueba si truck existe en el entorno utilizando el comando env.
env | grep truck
Verás que la variable truck aparece en la lista, a pesar de que no usaste export. Esto se debe a que la opción allexport estaba activa.
truck=chevy
Esta función puede ser muy útil, pero es una buena práctica desactivarla cuando ya no la necesites para evitar exportar variables de forma involuntaria. Desactivemos allexport.
set +o allexport
Finalmente, verifica que se haya desactivado.
set -o | grep allexport
La salida mostrará una vez más que la opción está en off.
allexport off
Cualquier variable nueva que crees a partir de este momento será una variable local por defecto, a menos que utilices explícitamente el comando export.
Persistir las Opciones de la Shell Usando el Archivo .bashrc
En este paso, aprenderás cómo hacer que tus personalizaciones de la shell sean permanentes. Cualquier alias, función u opción de shell que configures es temporal y se perderá al cerrar la sesión de la terminal. Para guardarlos permanentemente, debes añadirlos a un archivo de configuración de la shell.
Aunque el título menciona .bashrc, que es el archivo de configuración para la shell Bash, nuestro entorno de laboratorio utiliza la shell Zsh. El archivo de configuración equivalente para Zsh es ~/.zshrc. Este archivo es un script que se ejecuta automáticamente cada vez que abres una nueva shell interactiva, lo que lo convierte en el lugar perfecto para guardar tus ajustes personales.
Practicaremos esto haciendo permanente la opción de shell noclobber. La opción noclobber evita que sobrescribas accidentalmente un archivo existente al usar la redirección de salida (>).
Primero, usemos el editor de texto nano para añadir la opción noclobber a tu archivo ~/.zshrc. El símbolo ~ es un atajo para tu directorio personal, /home/labex.
nano ~/.zshrc
Este comando abre el archivo ~/.zshrc en el editor nano. Usa las teclas de flecha para mover el cursor hasta el final del archivo y añade la siguiente línea:
set -o noclobber
Ahora, guarda el archivo y sal de nano. Para hacerlo, presiona Ctrl+O (Write Out), presiona Enter para confirmar el nombre del archivo y luego presiona Ctrl+X para salir.
Ya estás de vuelta en el símbolo del sistema. Comprobemos si la opción noclobber está activa en tu shell actual.
set -o | grep noclobber
La salida será:
noclobber off
¿Por qué está desactivada? Porque tu sesión de shell actual no ha leído los cambios que acabas de realizar en el archivo ~/.zshrc. El archivo solo se lee cuando se inicia una nueva shell.
Para demostrarlo, iniciemos una nueva shell hija.
zsh
Ahora estás en una nueva shell. Comprobemos el estado de noclobber aquí.
set -o | grep noclobber
Esta vez, la salida será:
noclobber on
Esto confirma que las nuevas shells leen correctamente el archivo ~/.zshrc y aplican los ajustes. Ahora, sal de la shell hija para volver a tu shell padre original.
exit
Entonces, ¿cómo puedes aplicar los cambios a tu shell actual sin cerrarla y volverla a abrir? Puedes usar el comando source, que lee y ejecuta los comandos de un archivo en el contexto de la shell actual.
source ~/.zshrc
El comando source ha ejecutado ahora la línea set -o noclobber de tu archivo de configuración. Verifiquemos que noclobber esté ahora activado en nuestra shell original.
set -o | grep noclobber
La salida ahora será:
noclobber on
Has aprendido con éxito cómo persistir los ajustes de la shell editando el archivo ~/.zshrc y cómo aplicar esos cambios a tu sesión actual usando el comando source.
Resumen
En esta práctica de laboratorio, has aprendido los conceptos fundamentales para gestionar el entorno de la shell de Linux. Practicaste la creación de variables locales, que están limitadas a la shell actual, y variables de entorno, que son heredadas por cualquier proceso hijo. Se utilizaron comandos clave como echo para mostrar los valores de las variables, export para crear variables de entorno y env para enumerarlas. El concepto de herencia se exploró más a fondo iniciando una shell hija para probar qué variables y alias se transmitían con éxito desde la shell padre.
Además, exploraste métodos para controlar y persistir la configuración de tu shell. Utilizaste la opción set -o allexport para exportar automáticamente todas las variables definidas posteriormente, agilizando el proceso de ponerlas a disposición de los procesos hijos. Para asegurar que tus variables personalizadas, alias y opciones de shell estén disponibles en todas las futuras sesiones de terminal, aprendiste a añadir estas configuraciones al archivo de inicio .bashrc (o .zshrc), haciendo que las personalizaciones de tu entorno sean permanentes.



