Bash vs Python: cuándo usar cada uno en automatización
Comparativa práctica entre Bash y Python para automatización: aprende cuándo usar cada herramienta según la tarea, el sistema y la complejidad del script.
Cuando toca automatizar tareas en un servidor Linux, surge la eterna duda: ¿Bash o Python? Ambos son herramientas potentes, pero cada una tiene su terreno. Usar la correcta desde el principio te ahorrará dolores de cabeza y tiempo de depuración. Aquí te cuento cómo decido yo en el día a día.
Automatización rápida y operaciones del sistema: Bash
Bash es el rey cuando trabajas directamente con el sistema operativo. Si tu tarea se reduce a mover archivos, procesar logs con grep y awk, o ejecutar comandos en cadena, Bash es imbatible por su simplicidad y velocidad de ejecución.
#!/bin/bash
# Backup rápido de configuraciones de WordPress
for site in /var/www/*; do
tar -czf "/backups/$(basename $site)-$(date +%Y%m%d).tar.gz" "$site"
done
Este script tarda segundos en escribirse y ejecutarse. Bash brilla en tareas de una sola línea o scripts de menos de 50 líneas que usan tuberías (|) y redirecciones. También es la opción natural para tareas cron, hooks de Git o scripts de inicio de servicios.
Lógica compleja y manipulación de datos: Python
En cuanto la lógica se complica —condiciones anidadas, estructuras de datos, manejo de APIs o parsing de JSON/CSV—, Python te da mucha más claridad y control. Un script en Bash para procesar un JSON se vuelve rápido un infierno de expresiones regulares; en Python es trivial.
import json
import os
# Leer configuración de sitios y comprobar SSL
with open('sites.json') as f:
sites = json.load(f)
for site in sites:
if not os.path.exists(f"/etc/letsencrypt/live/{site['domain']}/fullchain.pem"):
print(f"⚠️ Certificado caducado o faltante para {site['domain']}")
Python también es superior cuando necesitas reutilizar código, manejar excepciones o trabajar con librerías externas (requests, paramiko, boto3). Si tu automatización supera las 100 líneas, plantéate Python desde el principio.
Ejecución remota y tareas en red: Python gana
Para automatizar despliegues en varios servidores, Bash con SSH puede servir, pero es frágil. Python con paramiko o fabric te da control de errores, reintentos y logging mucho más robusto.
from fabric import Connection
servers = ['web01', 'web02', 'db01']
for host in servers:
with Connection(host) as conn:
result = conn.run('uptime', hide=True)
print(f"{host}: {result.stdout.strip()}")
Aquí, si un servidor falla, el script continúa con los demás y puedes capturar el error. En Bash puro, un fallo de SSH pararía todo o requeriría manejo manual de $?.
Conclusión práctica
Mi regla personal: si puedo escribir la automatización en menos de 20 líneas y solo usa comandos del sistema, uso Bash. Si necesito condiciones complejas, APIs, parsing de datos o ejecución remota con manejo de errores, voy a Python. No hay una respuesta única; lo importante es conocer las fortalezas de cada uno y no forzar la herramienta equivocada. Al final, el mejor script es el que funciona sin sorpresas a las 3 de la mañana.