Gestión del Entorno y la Configuración de la Shell en Linux

CompTIABeginner
Practicar Ahora

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.