¿Por qué aprender Bash?¶
Bash (Bourne Again SHell) es un intérprete de comandos que funciona como interfaz textual entre el usuario y el núcleo del sistema operativo. Permite ejecutar instrucciones, combinar operaciones y controlar con precisión el comportamiento del sistema, todo desde una interfaz puramente textual. Su uso interactivo es el punto de partida para el desarrollo de habilidades avanzadas en administración y automatización.
Este es descendiente directo del shell de UNIX clásico (sh) y, al día de hoy,
sigue siendo la shell por defecto en la mayoría de las distros GNU/Linux y
macOS.
Filosofía UNIX en 1 minuto¶
Antes de continuar, es necesario que abordemos un concepto que guia el desarrollo y uso de un sistema basado en UNIX, como Linux.
“Haz una cosa y hazla bien.”
Cada comando hace una sola cosa.
La salida de un comando puede conectarse a la entrada de otro: composición.
Todo es un archivo. Sí, todo.
Pequeñas herramientas, combinadas con
|, pueden resolver problemas complejos.
Interacción básica con Bash¶
La consola Bash permite una interacción directa con el sistema operativo mediante una interfaz de línea de comandos. Este uso interactivo es ideal explorar y diagnosticar el sistema, así como verificar rápidamente el comportamiento de los diferentes pasos que pueden componer un script de automatización.
¿Qué es el uso interactivo?¶
Es la forma más inmediata de ejecutar comandos directamente en el shell. Cada
instrucción escrita en el prompt ($) es interpretada y ejecutada de inmediato
por Bash. Este modo de trabajo es crucial para comprender el comportamiento del
sistema operativo, ya que permite realizar pruebas rápidas, verificar
configuraciones, analizar resultados y familiarizarse con herramientas
disponibles.
Más adelante, vamos a ver el otro uso que tiene bash, la parte de scripting que nos permite ejecutar un conjunto de acciones como una sola.
Características clave¶
Retroalimentación sincrónica: cada comando produce una salida inmediatamente después de su ejecución, lo que permite comprobar que pasó de forma directa.
Exploración estructurada: mediante comandos, es posible navegar por la estructura de directorios del sistema, inspeccionar y modificar archivos.
Validación progresiva: el entorno permite realizar pruebas incrementales sin necesidad de desarrollar scripts completos. Esto permite verificar hipótesis operativas antes de automatizar.
Entorno altamente configurable: Bash permite ajustar dinámicamente variables, definir funciones y modificar el comportamiento del entorno sin necesidad de privilegios administrativos.
Ejemplo introductorio¶
1 2 3 4 5 6$ pwd /home/usuario $ ls -l -rw-r--r-- 1 usuario usuario 4096 jul 19 10:23 archivo.txt $ echo "Hola Mundo!" Hola Mundo!
pwd: imprime el directorio de trabajo actual, útil para orientarse dentro de jerarquías complejas de carpetas.ls -l: lista los archivos del directorio con detalles como permisos, propietario, grupo, tamaño y fechas de modificación.echo: imprime un mensaje en la consola, en este caso, el tradicional “Hola Mundo!”.
Tengan en cuenta que la terminal es sensible a mayusculas, y las instrucciones deben tener la forma correcta, o de lo contrario no funcionarán.
$ PWD
PWD: command not foundFuncionalidades prácticas¶
Historial de comandos: navegación con las teclas ↑ y ↓ permite acceder rápidamente a comandos anteriores.
Autocompletado: pulsar
Tabcompleta rutas de archivos y comandos, lo cual evita errores de tipeo y facilita el su uso.Patrones con comodines (globs):
*: representa cualquier cantidad de caracteres.?: representa un solo carácter.Ejemplo:
ls *.txtlista todos los archivos con extensión.txt.
Encadenamiento de comandos:
$ cd proyectos; ls; echo "Directorio explorado"Cada comando se ejecuta en secuencia, incluso si alguno falla. Esto permite combinar tareas sin necesidad de un script.
Separación condicional:
&&: solo ejecuta el segundo comando si el primero tiene éxito.||: solo ejecuta el segundo comando si el primero falla.Ejemplo:
$ make && ./programaPrimeros pasos en la terminal¶
🔹 ¿Cómo abro Bash?¶
En Linux: Ctrl+Alt+T o buscá “Terminal”
En macOS: Spotlight > Terminal
En Windows:
WSLo Git Bash. (no viene instalado, y es necesario seguir la guia de instalación)
2. Comandos para cambiar directorios y manipular archivos¶
El sistema de archivos en UNIX está organizado jerárquicamente. Los comandos de Bash permiten interactuar con esta estructura de forma precisa, tanto para navegación como para la gestión de archivos y directorios.
2.1 Navegación por directorios¶
pwd: muestra el directorio actual.cd <ruta>: cambia al directorio especificado.Relativo:
cd documentosAbsoluto:
cd /home/usuario/documentos
cd ~: accede al directorio personal del usuario.cd -: vuelve al directorio anterior.
1 2 3 4 5 6$ cd /etc $ pwd /etc $ cd ~ $ pwd /home/usuario
2.2 Listado de contenidos¶
ls: lista los archivos del directorio.ls -l: muestra detalles como permisos y tamaño.ls -a: incluye archivos ocultos.ls -lh: usa unidades legibles por humanos.
$ ls -lh
-rw-r--r-- 1 usuario usuario 1.2K jul 19 10:23 notas.txt2.3 Creación de directorios y archivos¶
mkdir nombre: crea un nuevo directorio.mkdir -p ruta/compuesta: crea varios niveles si no existen.touch archivo: crea un archivo vacío o actualiza su fecha de modificación.
$ mkdir proyectos
$ cd proyectos
$ touch main.c2.4 Copia, movimiento y eliminación¶
cp origen destino: copia archivos.cp -r origen destino: copia directorios recursivamente.mv origen destino: mueve o renombra.rm archivo: elimina archivos.rm -r directorio: elimina directorios recursivamente.rm -rf: eliminación forzada, sin confirmación.
$ cp datos.txt copia.txt
$ mv copia.txt ../backup/
$ rm -r carpeta_antigua2.5 Inspección del contenido de archivos¶
cat archivo: imprime el contenido.less archivo: permite navegación por páginas (/para buscar,qpara salir).head -n N: muestra las primerasNlíneas.tail -n N: muestra las últimasNlíneas.
$ head -n 5 log.txtEstas herramientas son esenciales para verificar contenido, diagnosticar errores y explorar datos.
Redirecciones y Pipes en Bash¶
La capacidad de Bash para redirigir flujos de entrada y salida, así como conectar comandos mediante tuberías, es una herramienta poderosa para construir flujos de procesamiento de datos. Estas capacidades son centrales para cualquier entorno de scripting, administración de sistemas o desarrollo de herramientas CLI.
Redirecciones estándar¶
Las redirecciones permiten controlar cómo los programas leen o escriben datos mediante los tres flujos estándar:
stdin (0): entrada estándar (por defecto el teclado).
stdout (1): salida estándar (por defecto la pantalla).
stderr (2): salida de errores (también por defecto la pantalla, pero se puede redirigir por separado).
Redirección de salida (> y >>)¶
ls -l > listado.txtCrea (o sobrescribe) el archivo
listado.txtcon la salida del comando.
echo "Nueva entrada" >> listado.txtAgrega texto al final del archivo sin sobrescribir el contenido existente. Ideal para registros (
logs).
Redirección de entrada (<)¶
wc -l < listado.txtEl archivo
listado.txtse utiliza como entrada para contar líneas. Es equivalente acat listado.txt | wc -l, pero más eficiente.
2.1.3 Redirección de errores (2> y 2>>)¶
ls archivo_inexistente 2> errores.logCaptura los mensajes de error y los guarda en
errores.log, permitiendo separar el flujo de salida del flujo de errores.
comando >> salida.log 2>> errores.logRedirige la salida estándar y los errores a archivos distintos sin eliminar el contenido previo.
2.2 Tuberías (|)¶
Una pipe permite conectar la salida de un comando con la entrada de otro. Esencialmente, permite construir flujos de datos compuestos donde cada etapa transforma la información de forma sucesiva. Esto habilita una forma modular y reutilizable de construcción de herramientas.
2.2.1 Ejemplos fundamentales¶
ls -l | grep "\.txt"Filtra los archivos listados para mostrar solo los que terminan en
.txt.grepes un filtro que actúa sobre líneas de texto.
du -sh * | sort -hMuestra el tamaño de cada archivo o directorio y ordena los resultados humanamente, es decir, respetando los sufijos (K, M, G).
ps aux | grep firefox | awk '{print $2}'Extrae los identificadores de proceso (PID) relacionados con Firefox. Este patrón se usa frecuentemente en automatización de administración de procesos.
2.3 Composición: pipes con redirecciones¶
Se pueden combinar ambas técnicas para realizar flujos complejos:
cat archivo.txt | grep "error" > errores.txtEl contenido filtrado se redirige directamente a un nuevo archivo. Este patrón es común en procesamiento de logs, búsquedas masivas o depuración de sistemas.
find /var/log -type f | xargs grep -i fail 2>/dev/null > fallas.txtBusca recursivamente archivos en
/var/log, y filtra aquellos que contienen la palabra “fail” (ignorando mayúsculas). Los errores se descartan y la salida se guarda.
🔎 6. Búsqueda de archivos y contenido¶
find . -name "*.txt" # Busca archivos por nombre
grep "palabra" archivo.txt # Busca texto en archivo
grep -r "funcion" src/ # Busca recursivamente7. Variables y comandos útiles¶
1 2 3 4 5 6 7 8 9 10mi_var="Hola mundo" echo $mi_var # Variables de entorno echo $HOME echo $PATH # Comando útil which bash # Ruta del ejecutable type ls # Muestra si es alias, función, o comando
🧱 8. Permisos y ejecución¶
chmod +x script.sh # Hace ejecutable un archivo
ls -l # Muestra permisosPermisos: rwx (lectura, escritura, ejecución) Ejemplo: -rwxr-xr-- → usuario
puede todo, grupo solo lee y ejecuta, otros solo leen.
🔁 9. Control de procesos¶
ps aux # Lista todos los procesos
top # Monitor en tiempo real
kill PID # Termina un proceso por ID
& # Ejecuta en segundo plano
ctrl + z # Pausa proceso (fg/bg para retomarlo)4. Introducción intuitiva a los scripts en Bash¶
Un script de Bash es un archivo de texto que contiene una secuencia de comandos que Bash puede ejecutar en orden. Se utilizan para automatizar tareas que normalmente se realizarían manualmente en la consola, con la ventaja adicional de ser reutilizables, replicables y versionables.
4.1 ¿Qué es un script?¶
Un script puede verse como un programa simple escrito en lenguaje de comandos. Es útil cuando se requiere repetir una serie de instrucciones o realizar tareas complejas que involucran lógica condicional, lazos y estructuras de control.
4.2 Estructura básica de un script¶
#!/bin/bash
# Este es un comentario
echo "Hola, mundo"
date#!/bin/bash: indica que el script debe ejecutarse con Bash.echo: imprime texto.date: muestra la fecha y hora actual.
4.3 Ejemplo aplicado: respaldo automático¶
1 2 3 4 5 6 7 8#!/bin/bash ORIGEN="$HOME/documentos" DESTINO="$HOME/respaldo" FECHA=$(date +%Y-%m-%d) mkdir -p "$DESTINO" cp -r "$ORIGEN" "$DESTINO/respaldo-$FECHA" echo "Respaldo completado en $DESTINO/respaldo-$FECHA"
Este script:
Define un origen y un destino.
Usa la fecha como sufijo del respaldo.
Crea el directorio si no existe.
Copia los archivos.
Informa al usuario al finalizar.
4.4 Permisos y ejecución¶
Para que un script sea ejecutable:
chmod +x script.sh
./script.shEsto le otorga permisos de ejecución y lo ejecuta desde el directorio actual.
4.5 Consideraciones formales¶
Desde una perspectiva de diseño de software, los scripts son herramientas de automatización declarativa. En muchas ocasiones pueden formar parte de pipelines de CI/CD, herramientas de despliegue, diagnósticos y pruebas automatizadas.
Por ello, se recomienda aplicar buenas prácticas como:
Validar argumentos.
Documentar cada paso.
Manejar errores adecuadamente.
Utilizar nombres de variables legibles.
📘 11. Control de flujo¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16# Condicional if [ -f archivo.txt ]; then echo "Existe" else echo "No existe" fi # lazo for for archivo in *.txt; do echo "$archivo tiene $(wc -l < "$archivo") líneas" done # lazo while while read linea; do echo "Línea: $linea" done < archivo.txt
🧪 12. Globs, wildcards y expansión¶
Los patrones de expansión (globs) son una herramienta fundamental para el manejo eficiente de archivos múltiples.
1 2 3 4 5 6 7 8 9 10 11*.txt # todos los .txt ? # un solo caracter [abc]* # comienza con a, b o c [0-9]* # comienza con un dígito [!0-9]* # NO comienza con un dígito **/*.py # todos los .py recursivamente (bash 4.0+) echo {1..5} # 1 2 3 4 5 echo {a..d}.txt # a.txt b.txt c.txt d.txt echo {001..100} # números con padding de ceros echo archivo.{txt,md,py} # archivo.txt archivo.md archivo.py
Expansión avanzada:
1 2 3 4 5 6 7 8 9 10 11 12 13# Expansión aritmética echo $((5 + 3)) # 8 echo $((2**3)) # 8 (potencia) # Expansión de comandos echo "Hoy es $(date +%A)" echo "Archivos: $(ls | wc -l)" # Expansión de parámetros archivo="documento.txt" echo "${archivo%.*}" # documento (sin extensión) echo "${archivo##*/}" # documento.txt (solo nombre) echo "${archivo:-backup}" # valor por defecto
📊 13. Comandos de análisis y procesamiento de texto¶
Bash incluye herramientas poderosas para el procesamiento de texto que forman el corazón de la filosofía UNIX.
13.1 Herramientas de análisis¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14# wc - contar líneas, palabras, caracteres wc -l archivo.txt # líneas wc -w archivo.txt # palabras wc -c archivo.txt # caracteres # sort - ordenar contenido sort archivo.txt # orden alfabético sort -n numeros.txt # orden numérico sort -r archivo.txt # orden inverso sort -k2 datos.csv # ordenar por segunda columna # uniq - eliminar duplicados (requiere entrada ordenada) sort archivo.txt | uniq # elimina duplicados sort archivo.txt | uniq -c # cuenta ocurrencias
13.2 Búsqueda y filtrado¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14# grep - búsqueda de patrones grep "patrón" archivo.txt # busca líneas que contengan "patrón" grep -i "patrón" archivo.txt # búsqueda sin distinción de mayúsculas grep -r "patrón" directorio/ # búsqueda recursiva grep -n "patrón" archivo.txt # muestra números de línea grep -v "patrón" archivo.txt # líneas que NO contengan "patrón" grep -E "patrón1|patrón2" archivo # expresiones regulares extendidas # find - búsqueda de archivos find . -name "*.txt" # archivos .txt en directorio actual find /home -user juan -size +1M # archivos de juan mayores a 1MB find . -type d -name "test*" # directorios que empiecen con "test" find . -mtime -7 # archivos modificados últimos 7 días find . -executable -type f # archivos ejecutables
13.3 Transformación de texto¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15# sed - editor de flujo sed 's/viejo/nuevo/' archivo.txt # reemplaza primera ocurrencia por línea sed 's/viejo/nuevo/g' archivo.txt # reemplaza todas las ocurrencias sed '5d' archivo.txt # elimina línea 5 sed -n '10,20p' archivo.txt # muestra líneas 10 a 20 # awk - procesamiento de texto estructurado awk '{print $1}' datos.txt # imprime primera columna awk -F',' '{print $2}' datos.csv # usa coma como separador awk '{sum+=$3} END {print sum}' datos # suma tercera columna awk 'NR>1 {print $0}' archivo # omite primera línea (header) # cut - extraer columnas cut -d',' -f1,3 datos.csv # columnas 1 y 3 de CSV cut -c1-10 archivo.txt # primeros 10 caracteres
🔧 14. Administración del sistema¶
14.1 Información del sistema¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15# Información básica uname -a # información completa del sistema whoami # usuario actual id # información de usuario y grupos uptime # tiempo de funcionamiento y carga df -h # espacio en disco (human readable) free -h # memoria RAM disponible lscpu # información del procesador # Procesos ps aux # todos los procesos ps -ef | grep nginx # procesos específicos top # monitor en tiempo real htop # versión mejorada de top (si está instalada) jobs # trabajos en segundo plano
14.2 Gestión de procesos¶
1 2 3 4 5 6 7 8 9# Control de procesos command & # ejecutar en segundo plano nohup command & # ejecutar sin depender de la terminal kill PID # terminar proceso por ID kill -9 PID # forzar terminación killall nombre_proceso # terminar por nombre ctrl + z # suspender proceso (en terminal) fg # traer proceso suspendido al primer plano bg # enviar proceso suspendido al segundo plano
14.3 Variables de entorno¶
1 2 3 4 5 6 7 8 9 10 11# Gestión de variables export VAR="valor" # crear/modificar variable de entorno echo $PATH # mostrar PATH actual env # listar todas las variables de entorno unset VAR # eliminar variable # Variables útiles echo $HOME # directorio personal echo $USER # nombre de usuario echo $SHELL # shell actual echo $PWD # directorio actual
15. Redirección y tuberías avanzadas¶
15.1 Redirección de entrada/salida¶
1 2 3 4 5 6 7 8 9 10 11# Redirección básica comando > archivo # sobrescribir archivo con salida comando >> archivo # agregar al final del archivo comando < archivo # usar archivo como entrada comando 2> errores.log # redirigir errores a archivo comando &> todo.log # redirigir todo (salida + errores) # Redirección avanzada comando 2>&1 # redirigir errores a salida estándar comando | tee archivo.log # mostrar en pantalla Y guardar en archivo comando > /dev/null 2>&1 # descartar toda la salida
15.2 Tuberías complejas¶
1 2 3 4 5 6 7 8 9 10 11 12# Combinaciones útiles cat archivo.log | grep ERROR | sort | uniq -c | sort -nr # ↳ errores únicos ordenados por frecuencia ls -la | awk '{sum+=$5} END {print "Total:", sum, "bytes"}' # ↳ suma el tamaño total de archivos ps aux | sort -k3 -nr | head -5 # ↳ procesos que más CPU consumen find . -name "*.log" | xargs grep -l "ERROR" # ↳ archivos .log que contienen "ERROR"
🧙 16. Trucos de la terminal¶
16.1 Navegación en el historial¶
!! # repite el último comando
!n # repite el comando número n del historial
!grep # repite el último comando que comienza con "grep"
!?archivo # repite el último comando que contiene "archivo"
^viejo^nuevo # reemplaza "viejo" por "nuevo" en último comando16.2 Atajos de teclado esenciales¶
1 2 3 4 5 6 7 8 9 10ctrl + r # búsqueda inversa en el historial ctrl + a # ir al inicio de la línea ctrl + e # ir al final de la línea ctrl + w # borrar palabra anterior ctrl + k # borrar desde cursor al final ctrl + u # borrar toda la línea ctrl + l # limpiar pantalla (equivale a 'clear') ctrl + c # interrumpir proceso actual ctrl + d # cerrar terminal o EOF ctrl + z # suspender proceso actual
16.3 Alias y funciones útiles¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26# Alias comunes alias l='ls -lah' alias gs='git status' alias ll='ls -alF' alias la='ls -A' alias grep='grep --color=auto' alias ..='cd ..' alias ...='cd ../..' # Funciones útiles function mkcd() { mkdir -p "$1" && cd "$1" } function backup() { cp "$1" "$1.backup.$(date +%Y%m%d_%H%M%S)" } function extract() { case "$1" in *.tar.gz) tar -xzf "$1" ;; *.zip) unzip "$1" ;; *.rar) unrar e "$1" ;; *) echo "Formato no soportado" ;; esac }
🔍 17. Expresiones regulares en Bash¶
Las expresiones regulares son patrones que permiten búsquedas y manipulaciones complejas de texto.
17.1 Sintaxis básica¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15# Metacaracteres básicos . # cualquier carácter * # cero o más del anterior + # uno o más del anterior (ERE) ? # cero o uno del anterior (ERE) ^ # inicio de línea $ # fin de línea [] # clase de caracteres [^] # negación de clase # Ejemplos con grep grep '^[A-Z]' archivo.txt # líneas que empiezan con mayúscula grep '[0-9]\\{3\}' archivo.txt # exactamente 3 dígitos grep -E '[0-9]{2,4}' archivo.txt # entre 2 y 4 dígitos grep '\\b[A-Za-z]+@[A-Za-z]+\\.[A-Za-z]+\\b' emails.txt # emails básicos
17.2 Aplicaciones prácticas¶
1 2 3 4 5 6 7 8 9 10 11# Validar formato de fecha (YYYY-MM-DD) echo "2023-12-25" | grep -E '^[0-9]{4}-[0-9]{2}-[0-9]{2}$' # Extraer números de teléfono grep -E '\\([0-9]{3}\\) [0-9]{3}-[0-9]{4}' contactos.txt # Buscar direcciones IP grep -E '([0-9]{1,3}\\.){3}[0-9]{1,3}' logs.txt # Encontrar URLs grep -E 'https?://[A-Za-z0-9.-]+\\.[A-Za-z]{2,}' texto.html
🔐 18. Seguridad básica¶
18.1 Principios de seguridad¶
1 2 3 4 5 6 7 8# Nunca hagas esto (¡puede destruir el sistema!) sudo rm -rf / # elimina TODO el sistema :(){ :|:& };: # fork bomb - puede colapsar el sistema # Uso responsable de sudo sudo -l # ver permisos de sudo sudo -u usuario comando # ejecutar como otro usuario sudo !! # ejecutar último comando con sudo
18.2 Permisos de archivos¶
1 2 3 4 5 6 7 8 9 10# Entender permisos (rwx para owner, group, others) ls -l archivo.txt # -rw-r--r-- significa rw-/r--/r-- chmod 755 script.sh # rwxr-xr-x (ejecutable para owner) chmod u+x archivo # agregar ejecución para owner chmod go-w archivo # quitar escritura para group y others chown usuario:grupo archivo # cambiar propietario # Umask - permisos por defecto umask 022 # archivos nuevos: 644, directorios: 755 umask 077 # archivos nuevos: 600, directorios: 700
18.3 Validación en scripts¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24#!/bin/bash # Ejemplo de script seguro # Validar argumentos if [ $# -lt 1 ]; then echo "Uso: $0 <archivo>" exit 1 fi archivo="$1" # Validar que el archivo existe if [ ! -f "$archivo" ]; then echo "Error: El archivo '$archivo' no existe" exit 1 fi # Validar permisos de lectura if [ ! -r "$archivo" ]; then echo "Error: No se puede leer '$archivo'" exit 1 fi echo "Procesando archivo seguro: $archivo"
🧹 19. Buenas prácticas avanzadas¶
19.1 Scripting robusto¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30#!/bin/bash # Script con buenas prácticas # Configuración estricta set -euo pipefail # salir en error, variables no definidas, errores en pipes # Variables de configuración readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" readonly TEMP_DIR="/tmp/mi_script_$$" readonly LOG_FILE="${SCRIPT_DIR}/mi_script.log" # Función de limpieza cleanup() { local exit_code=$? [ -d "$TEMP_DIR" ] && rm -rf "$TEMP_DIR" exit $exit_code } trap cleanup EXIT # Función de logging log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE" } # Crear directorio temporal mkdir -p "$TEMP_DIR" log "Script iniciado" # ... resto del script log "Script completado"
19.2 Manejo de errores¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31# Verificar comandos críticos if ! command -v git &> /dev/null; then echo "Error: git no está instalado" exit 1 fi # Timeout para comandos que pueden colgarse timeout 30s wget https://ejemplo.com/archivo.zip || { echo "Error: Timeout en descarga" exit 1 } # Retry con backoff exponencial retry_command() { local max_attempts=3 local delay=1 local attempt=1 while [ $attempt -le $max_attempts ]; do if "$@"; then return 0 fi echo "Intento $attempt falló, reintentando en ${delay}s..." sleep $delay delay=$((delay * 2)) attempt=$((attempt + 1)) done return 1 }
📈 20. Monitoreo y debugging¶
20.1 Debugging de scripts¶
1 2 3 4 5 6 7 8 9 10 11# Ejecutar con traza bash -x script.sh # muestra cada comando antes de ejecutarlo bash -v script.sh # muestra líneas del script mientras las lee # Dentro del script set -x # activar modo debug comando_a_debuggear set +x # desactivar modo debug # Variables de debugging export PS4='+ ${BASH_SOURCE}:${LINENO}: ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'
20.2 Monitoreo del sistema¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15# Monitoreo de recursos watch -n 1 'df -h' # espacio en disco cada segundo watch -n 2 'free -h' # memoria cada 2 segundos iostat 1 # I/O cada segundo sar -u 1 5 # CPU usage cada segundo, 5 veces # Logs del sistema tail -f /var/log/syslog # seguir log del sistema en tiempo real journalctl -f # logs de systemd en tiempo real dmesg | tail # mensajes del kernel # Análisis de red netstat -tuln # puertos abiertos ss -tuln # versión moderna de netstat lsof -i :80 # procesos usando puerto 80
🚀 21. Automatización con cron¶
21.1 Sintaxis de crontab¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17# Editar crontab personal crontab -e # Formato: minuto hora día mes día_semana comando # * * * * * comando # | | | | | # | | | | +--- día de la semana (0-7, 0 y 7 = domingo) # | | | +----- mes (1-12) # | | +------- día del mes (1-31) # | +--------- hora (0-23) # +----------- minuto (0-59) # Ejemplos 0 2 * * * /home/user/backup.sh # diario a las 2 AM 30 14 * * 1 /home/user/weekly.sh # lunes a las 2:30 PM 0 0 1 * * /home/user/monthly.sh # primer día del mes */15 * * * * /home/user/monitor.sh # cada 15 minutos
21.2 Tareas comunes automatizadas¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15# Script de backup automatizado #!/bin/bash # /home/user/scripts/backup.sh BACKUP_DIR="/backup" SOURCE_DIR="/home/user/documents" DATE=$(date +%Y%m%d_%H%M%S) mkdir -p "$BACKUP_DIR" tar -czf "$BACKUP_DIR/backup_$DATE.tar.gz" "$SOURCE_DIR" # Mantener solo los últimos 7 backups find "$BACKUP_DIR" -name "backup_*.tar.gz" -mtime +7 -delete echo "Backup completado: backup_$DATE.tar.gz"
22. Ejercicios prácticos avanzados¶
23. Ejercicios para practicar¶
23.1 Nivel Principiante¶
Navegación básica: Creá la estructura
proyectos/2024/bash/ejerciciosusando un solo comando y navegá hasta el último directorio.Manipulación de archivos: Creá 5 archivos de texto con nombres
archivo1.txtaarchivo5.txt, escribí contenido diferente en cada uno usandoecho.Alias personalizados: Definí los siguientes alias en tu
~/.bashrc:llparals -alFlaparals -A..paracd ..grepparagrep --color=auto
23.2 Nivel Intermedio¶
Script contador: Escribí un script que cuente cuántos archivos hay de cada extensión en un directorio dado como argumento.
Backup inteligente: Creá un script que haga backup de un directorio, pero solo de los archivos modificados en los últimos N días (N como parámetro).
Limpiador de duplicados: Desarrollá un script que encuentre y opcionalmente elimine archivos duplicados basándose en su checksum MD5.
23.3 Nivel Avanzado¶
Parser de configuración: Escribí un script que lea un archivo de configuración en formato
clave=valory permita consultar valores específicos.Sincronizador de directorios: Implementá un script que sincronice dos directorios, copiando archivos nuevos y actualizados del origen al destino.
Dashboard de sistema: Creá un script que muestre en tiempo real (actualizándose cada segundo) el estado del sistema: CPU, memoria, procesos top, conexiones de red.
23.4 Desafíos Especiales¶
Mini shell: Implementá un shell básico que pueda ejecutar comandos simples, manejar pipes y redirecciones básicas.
Cron automático: Desarrollá un sistema que monitoree un directorio y ejecute automáticamente scripts que se coloquen en él.
Generador de reportes: Creá un script que genere reportes HTML de uso del sistema basándose en logs históricos.
24. Recursos para seguir¶
24.1 Documentación oficial¶
man bash→ la biblia completa de Bashinfo bash→ documentación GNU más detalladabash --help→ ayuda rápida de opcioneshelp comando→ ayuda para built-ins de Bash
24.2 Recursos en línea¶
TLDP Advanced Bash Guide → guía avanzada completa
explainshell.com → explica comandos complejos
ShellCheck → linter para scripts de shell
Bash Hackers Wiki → documentación comunitaria
24.3 Herramientas de diagnóstico¶
apropos comando # cuando no recordás el nombre exacto
whatis comando # descripción breve de un comando
which comando # ubicación del ejecutable
type comando # tipo de comando (built-in, alias, función)
command -V comando # información detallada del comando24.4 Libros recomendados¶
“Learning the Bash Shell” por Cameron Newham
“Bash Cookbook” por Carl Albing y JP Vossen
“Classic Shell Scripting” por Arnold Robbins
25. Consejos finales para el dominio de Bash¶
25.1 Metodología de aprendizaje¶
Experimentación segura: Siempre probá comandos nuevos en un entorno controlado antes de usarlos en datos importantes.
Lectura de código: Estudiá scripts existentes en
/usr/bin,/usr/local/biny repositorios de GitHub.Documentación activa: Comentá vos scripts no solo para otros, sino para vos mismo en el futuro.
Versionado: Usá Git para versionar tus scripts y seguir su evolución.
25.2 Patrones comunes¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23# Validación robusta de argumentos validate_args() { if [ $# -lt 1 ]; then echo "Uso: $0 <arg1> [arg2]" >&2 exit 1 fi } # Detección de dependencias check_dependencies() { local deps=("git" "curl" "jq") for dep in "${deps[@]}"; do if ! command -v "$dep" &> /dev/null; then echo "Error: $dep no está instalado" >&2 exit 1 fi done } # Configuración por defecto con override CONFIG_FILE="${CONFIG_FILE:-"$HOME/.mi_script.conf"}" VERBOSE="${VERBOSE:-false}" DRY_RUN="${DRY_RUN:-false}"
25.3 Integración con el ecosistema¶
Bash no existe en el vacío. Su verdadero poder emerge cuando se integra con:
Control de versiones: Git hooks, scripts de despliegue
Automatización: CI/CD pipelines, cron jobs
Monitoreo: Nagios, Zabbix, scripts de health check
Contenedores: Docker entrypoints, Kubernetes jobs
Infraestructura: Terraform, Ansible, provisioning scripts
26. Ejercicios finales de integración¶
[FINAL] Epílogo¶
Ahora tenés un conocimiento sólido de Bash que va desde los conceptos básicos hasta técnicas avanzadas de scripting y administración de sistemas. Como diría el viejo Ken Thompson:
“Cuando usás una interfaz gráfica, estás a 3 clicks de borrar todo. En la consola, sabés exactamente qué estás haciendo.”
El camino hacia la maestría¶
El dominio de Bash es un proceso continuo. Cada problema que resuelvas con la terminal te va a enseñar algo nuevo sobre la elegancia y el poder de la filosofía UNIX. Recordá que:
La práctica hace al maestro: Intentá resolver problemas cotidianos con scripts en lugar de hacerlos manualmente.
La comunidad es tu aliada: Compartí tus scripts y aprendé de otros en GitHub, Stack Overflow y foros especializados.
La documentación es tu guía: Siempre consultá
man,infoy recursos oficiales cuando tengas dudas.
Próximos pasos recomendados¶
Automatizá tu flujo de trabajo: Identificá tareas repetitivas y automatizalas.
Explorá herramientas complementarias:
tmux,vim,git,docker.Estudiá sistemas de administración:
systemd, configuración de servidores, Docker.Contribuí a proyectos open source: Muchos proyectos necesitan mejoras en sus scripts de build y deploy.
¡Nos vemos en el prompt, ~$!
1 2 3 4 5 6 7 8 9 10 11$ echo "¡Felicitaciones! Ahora sos parte del club del shell avanzado." ¡Felicitaciones! Ahora sos parte del club del shell avanzado. $ fortune | cowsay ________________________________ / La terminal es el lienzo del \ \ programador experto. / -------------------------------- \ ^__^ \ (oo)\_______ (__)\ )\/\n ||----w | || ||
“Unix is not just an operating system, it’s a way of thinking.” - Brian Kernighan