Yeda AI Tips · #176

English

Todo script de bash de más de 200 líneas pertenece a Python

Todo script de bash de más de doscientas líneas con condicionales debería reescribirse en Python. Más corto, y por fin testeable.

Bash es un pegamento excelente para una docena de líneas: ejecuta un comando, revisa el código de salida, canaliza hacia lo siguiente. Pero nunca fue diseñado como lenguaje de programación, y pasadas un par de cientos de líneas con ramificación real deja de ser pegamento y se vuelve un lastre que nadie en el equipo puede cambiar con seguridad.

Lo que bash no tiene

Los problemas no son de estilo, son huecos estructurales:

Un script de shell grande está a una comilla mal puesta de un rm -rf en la ruta equivocada, y como no se puede probar unitariamente, nadie lo refactoriza. Se calcifica.

La reescritura se paga sola

La misma lógica en Python suele ser más corta, no más larga, porque dejas de pelear con el lenguaje:

import subprocess, sys

def run(cmd: list[str]) -> str:
    result = subprocess.run(cmd, capture_output=True, text=True)
    if result.returncode != 0:
        raise RuntimeError(f"{cmd[0]} failed: {result.stderr.strip()}")
    return result.stdout

def deploy(env: str) -> None:
    if env not in ("staging", "production"):
        raise ValueError(f"unknown env: {env}")
    artifacts = run(["build", "--env", env]).splitlines()
    ...

Un script de bash de ~200 líneas a menudo se convierte en ~150 líneas de Python con excepciones reales, datos tipados y funciones que puedes importar y probar. Y los argumentos de subprocess se pasan como una lista, así que no hay campo minado de word-splitting ni de comillas del shell.

AspectoBashPython (o Go/Ruby)
Estructuras de datosStrings + arreglosListas, dicts, dataclasses
Manejo de erroresCódigos de salida, traps set -eExcepciones, stack traces
Pruebas unitariasNinguna prácticapytest, mocks, fixtures
Seguridad al refactorizarManual, frágilPruebas + verificador de tipos

Dónde está la línea

Esto no es "nunca uses bash". El pegamento corto y lineal se queda en bash. El disparador es longitud más ramificación: una vez que un script supera las ~200 líneas y carga condicionales, bucles y rutas de error significativas, el costo de las funciones que le faltan a bash supera el costo de una reescritura. En una ruta de despliegue o migración de datos, una suite de pruebas es la diferencia entre confianza y cruzar los dedos.

Movidas avanzadas

Recursos

¿Desarrollas sistemas de IA o en la nube? Yeda AI audita y refuerza pipelines de LLM y de despliegue en producción. Hablemos · Lee el blog