Jerarquía y Gestión de Variables en Shell
Para comprender cómo interactúan los procesos en un entorno Unix/Linux, el comando pstree es fundamental, ya que permite visualizar la estructura de procesos padre e hijo en el sistema.
Persistencia de Variables de Entorno
Las variables pueden definirse de forma temporal en la sesión actual o de forma permanente mediante la edición de archivos de configuración:
- Archivos de usuario:
~/.bash_profiley~/.bashrcgestionan la configuración específica para el usuario que inicia sesión. - Configuración global: Los archivos
/etc/profiley/etc/bashrcafectan a todos los usuarios. Se recomienda encarecidamente añadir scripts personalizados en el directorio/etc/profile.d/en lugar de modificar directamente los archivos globales.
Herramientas de Inspección y Control
Existen diversos comandos para administrar el entorno de ejecución:
set: Lista todas las variables, incluyendo las locales y las de entorno.env: Filtra y muestra únicamente las variables exportadas al entorno global.export: Permite asignar una variable al entorno global para que sea heredada por procesos hijos.unset: Elimina una variable o función de la memoria de la shell.readonly: Define variables de solo lectura que no pueden ser modificadas hasta que finalice la sesión de la shell.
# Ejemplo: Listar nombres de variables exportadas mediante procesamiento de texto
export | awk -F '[ :=]' '{print $3}'
# Ejecución secuencial de instrucciones
mkdir -p /tmp/proyecto_shell; cd /tmp/proyecto_shell; touch index.sh
Flujo de Carga de la Shell
Cuando se inicia una sesión SSH, Bash sigue un orden lógico para cargar el entorno:
- Se ejecuta
/etc/profilepara establecer la configuración global inicial. - Se procesan todos los scripts dentro de
/etc/profile.d/. - Busca y ejecuta
$HOME/.bash_profilepara configuraciones específicas del usuario. - Finalmente, se carga
$HOME/.bashrcpara definir alias y variables de shell adicionales.
Parámetros Especiales de Posición
Bash utiliza variables reservadas para capturar argumentos pasados a un script:
$0: Ruta y nombre del script ejecutado.$1, $2, ... $n: Argumentos posicionales. Si n > 9, se debe usar${10}.$#: Devuelve el número total de parámetros proporcionados.$*: Representa todos los argumentos como una única cadena de texto.$@: Representa todos los argumentos como elementos independientes, ideal para iteraciones.
Variables de Estado y Proceso
# Variables de control de ejecución
echo "Estado de salida del último comando: $?"
echo "ID del proceso (PID) actual: $$"
echo "PID del último proceso ejecutado en segundo plano: $!"
echo "Último argumento del comando previo: $_"
Manipulación Avanzada de Cadenas (Substrings)
Bash ofrece una sintaxis interna eficiente para manipular cadenas sin recurrir a herramietnas externas como sed o awk:
# Definición de una variable de prueba
TEXTO="ingenieria_de_software"
echo ${#TEXTO} # Longitud de la cadena
echo ${TEXTO:0:10} # Extrae los primeros 10 caracteres
echo ${TEXTO#*_} # Elimina el prefijo más corto que coincida con '*' seguido de '_'
echo ${TEXTO##*n} # Elimina el prefijo más largo que coincida hasta la última 'n'
echo ${TEXTO%_*} # Elimina el sufijo más corto desde el final
echo ${TEXTO/software/sistemas} # Reemplaza la primera coincidencia
echo ${TEXTO//e/E} # Reemplaza todas las ocurrencias de 'e' por 'E'
Expansión y Evaluación Condicional de Variables
Estas estructuras permiten gestionar valores nulos o no definidos de forma elegante:
${var:-valor}: Retorna "valor" sivarestá vacía, pero no modifica la variable original.${var:=valor}: Sivarestá vacía, le asigna "valor" y lo retorna.${var:?mensaje}: Sivares nula, imprime el mensaje en el canal de error y detiene la ejecución.${var:+valor}: Retorna "valor" solo si la variable ya contiene algún dato.
Operaciones Comunes y Automatización
Ejemplos prácticos de tareas recurrentes en administración de sistemas:
# Ejecución en segundo plano redirigiendo la salida
nohup script_pesado.sh > /dev/null 2>&1 &
# Diversas formas de contar caracteres en una variable
STRLEN="Bash_Scripting"
echo ${#STRLEN}
expr length "$STRLEN"
echo "$STRLEN" | wc -c
# Limpieza de archivos antiguos (mayores a 15 días)
find /ruta/logs -name "*.log" -type f -mtime +15 -exec rm -f {} \;