Calidad y Depuración en Bash
A medida que los scripts crecen, es crucial mantenerlos robustos, legibles y fáciles de depurar. Este módulo cubre herramientas y técnicas para detectar errores, aplicar buenas prácticas y rastrear problemas.
1. Errores comunes en scripts Bash #
- Usar variables no definidas → genera errores inesperados.
- No comprobar códigos de salida → el script sigue ejecutando pese a fallos.
- No citar correctamente (
" "vs' '), causando problemas con espacios. - No limpiar archivos temporales → basura en el sistema.
- Usar rutas relativas sin control del directorio actual.
- No manejar errores de comandos críticos (
cp,rsync, etc.).
👉 Para evitar muchos de estos errores, ya aprendiste a usar:
1set -Eeuo pipefail
2. Linter para scripts: shellcheck #
shellcheck analiza el código de un script y reporta problemas, malas prácticas y posibles errores.
Instalación #
En Ubuntu/Debian:
1sudo apt update 2sudo apt install shellcheck
En macOS:
1brew install shellcheck
Uso básico #
1shellcheck mi_script.sh
Salida típica:
In mi_script.sh line 5:
for f in $(ls *.txt)
^-- SC2045: Use 'for f in *.txt' instead of 'ls | ...'
👉 Muestra el número de línea y sugiere la corrección.
Integración con editores #
- VS Code: instala la extensión “ShellCheck” → te avisa en tiempo real.
- Vim/Neovim: usa el plugin
aleococ-shellcheck. - JetBrains: tiene soporte mediante plugins.
3. Formateador de código: shfmt #
Para mantener un estilo consistente en el código.
Instalación #
Ubuntu/Debian:
1sudo apt install shfmt
macOS:
1brew install shfmt
Formatear un script #
1shfmt -w mi_script.sh
Opciones útiles:
-i 2→ indentación de 2 espacios-ci→ identa correctamente los bloquescase
Ejemplo:
1shfmt -w -i 2 mi_script.sh
4. Depuración con set -x #
El modo traza (set -x) muestra cada comando que se ejecuta junto con los valores de las variables.
Activar en todo el script #
1#!/usr/bin/env bash 2set -Eeuo pipefail 3set -x # Activa el modo traza 4 5echo "Inicio" 6VAR=42 7echo "El valor es $VAR"
Salida:
+ echo 'Inicio'
Inicio
+ VAR=42
+ echo 'El valor es 42'
El valor es 42
Activar solo en una sección #
1set -x 2 # Sección a depurar 3comando1 4comando2 5set +x
👉 set +x desactiva el modo traza.
5. Personalizar el prompt de depuración con PS4 #
Permite añadir contexto (línea y función) a los mensajes de traza.
1export PS4='+ (${BASH_SOURCE}:${LINENO}): ' 2set -x
Salida de ejemplo:
+ (mi_script.sh:5): VAR=42
+ (mi_script.sh:6): echo 'Valor=42'
6. Depuración con trap ERR #
Permite capturar y reaccionar ante errores.
1#!/usr/bin/env bash 2set -Eeuo pipefail 3 4trap 'echo "❗ Error en la línea $LINENO"' ERR 5 6echo "Inicio" 7ls /no_existe 8echo "Fin"
Salida:
Inicio
ls: cannot access '/no_existe': No such file or directory
❗ Error en la línea 6
👉 El script muestra el número de línea donde falló.
7. Uso de time para medir rendimiento #
Permite medir cuánto tarda en ejecutarse un comando o bloque de código.
1time sleep 3
Salida:
real 0m3.002s
user 0m0.001s
sys 0m0.000s
8. Ejemplo integrador: depuración de un backup #
Script backup.sh:
1#!/usr/bin/env bash 2set -Eeuo pipefail 3trap 'echo "❗ Error en línea $LINENO"' ERR 4export PS4='+ (${BASH_SOURCE}:${LINENO}): ' 5 6LOG=backup.log 7SRC=~/documentos 8DEST=~/backups 9ARCHIVO=backup_$(date +%Y%m%d).tar.gz 10 11set -x 12mkdir -p "$DEST" 13tar -czf "$DEST/$ARCHIVO" "$SRC" >>"$LOG" 2>&1 14echo "✅ Backup completado: $DEST/$ARCHIVO" 15set +x
👉 Este script:
- Se detiene si falla cualquier comando.
- Informa del error y la línea exacta.
- Muestra trazas para depurar.
- Genera un log del proceso.
9. Ejercicio práctico 1 #
Crea un script analisis.sh que:
- Acepte como argumento la ruta a un archivo de texto.
- Muestre cuántas líneas, palabras y caracteres tiene.
- Use
set -xpara depurar y muestre las trazas. - Usa
shellcheckpara detectar problemas y corrígelos.
10. Ejercicio práctico 2 #
Crea un script procesa_csv.sh que:
- Procese un archivo CSV grande.
- Mida el tiempo que tarda en ejecutarse con
time. - Use
trap ERRpara mostrar un mensaje en caso de fallo. - Aplica
shfmtpara mantener un formato uniforme.
11. Buenas prácticas #
- ✅ Usa
shellcheckantes de desplegar scripts en producción. - ✅ Mantén un estilo consistente con
shfmt. - ✅ Activa
set -xsolo en depuración, no en producción. - ✅ Usa
trap ERRpara mostrar mensajes claros en fallos. - ✅ Documenta los scripts con comentarios y ejemplos de uso.
Resumen del tema
Conceptos clave #
- Análisis Estático con ShellCheck: detección proactiva de errores de sintaxis, variables sin encomillar (SC2086) y problemas de portabilidad.
- Estandarización de Formato con
shfmt: formateo automático de indentación y espaciado consistente (shfmt -w -i 2 script.sh). - Trazabilidad y Depuración Interactiva: activación de trazas con
set -x/set +xy personalización del prompt de depuración conexport PS4='+ (${BASH_SOURCE}:${LINENO}): '. - Trampas de Error en Tiempo de Ejecución (
trap ... ERR): detección de la línea exacta del fallo ($LINENO) para registro en logs antes de abortar. - Medición de Tiempos con
time: análisis de rendimiento clasificando tiempo real (wall clock), tiempo de CPU en espacio de usuario y tiempo de sistema.
Qué debes recordar #
Validar scripts con shellcheck, formatear con shfmt y trazar con set -x y trap ERR asegura calidad profesional y depuración rápida.