<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Un Dev Más</title><description>Blog personal de un desarrollador de software</description><link>https://raksodiano.github.io</link><atom:link href="https://raksodiano.github.io/rss.xml" rel="self" type="application/rss+xml"/><item><title>Presentación</title><link>https://raksodiano.github.io/2026/02/28/presentacion</link><guid isPermaLink="true">https://raksodiano.github.io/2026/02/28/presentacion</guid><description>Me presento, soy Oskar Torres, también conocido como Raksodiano. Un ingeniero en informática apasionado por la tecnología y el software libre.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;¡Hola, bienvenido!&lt;/h2&gt;
&lt;p&gt;Me presento: soy &lt;strong&gt;Oskar Torres&lt;/strong&gt;, profesionalmente conocido en el entorno tecnológico como &lt;strong&gt;Raksodiano&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Soy ingeniero en informática con una sólida trayectoria en el desarrollo de software. Mi pasión por el aprendizaje continuo y mi interés por compartir conocimientos me han impulsado a crear este espacio, donde pretendo documentar mis experiencias, retos y descubrimientos en el mundo de la tecnología.&lt;/p&gt;
&lt;h2&gt;El propósito de este blog&lt;/h2&gt;
&lt;p&gt;Tras un periodo de reflexión sobre mi presencia digital, decidí retomar el hábito de escribir. Anteriormente gestioné un blog titulado &lt;code&gt;unslackermas&lt;/code&gt;, donde compartía mi experiencia con &lt;a href=&quot;http://www.slackware.com/&quot;&gt;Slackware Linux&lt;/a&gt;. Aunque aquel proyecto quedó en pausa, hoy inicio esta nueva etapa con una visión más amplia y madura.&lt;/p&gt;
&lt;p&gt;Este sitio no es solo un repositorio de información, sino un diario técnico y un medio para conectar con otros profesionales e interesados en el sector.&lt;/p&gt;
&lt;h2&gt;Qué encontrarás en este espacio&lt;/h2&gt;
&lt;p&gt;Mi objetivo es ofrecer contenido de valor estructurado en varias categorías:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tutoriales Técnicos&lt;/strong&gt;: Guías detalladas sobre desarrollo y herramientas específicas. Creo firmemente que la mejor manera de consolidar el conocimiento es comunicándolo de forma clara y accesible.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Optimización y Metodologías&lt;/strong&gt;: Notas sobre cómo mejorar flujos de trabajo, optimizar procesos de desarrollo y aplicar mejores prácticas en el día a día profesional.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reseñas y Análisis&lt;/strong&gt;: Opiniones fundamentadas sobre herramientas de software, literatura técnica y recursos de aprendizaje.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Intereses Personales&lt;/strong&gt;: Espacio para compartir aficiones que complementan mi perfil, como los videojuegos clásicos y la lectura, que aportan una perspectiva creativa a mi labor técnica.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Stack Tecnológico del Blog&lt;/h2&gt;
&lt;p&gt;Como entusiasta de la eficiencia y la personalización, este blog ha sido desarrollado utilizando un flujo de trabajo minimalista y potente:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.gnu.org/software/emacs/&quot;&gt;GNU Emacs&lt;/a&gt;&lt;/strong&gt;: Mi herramienta principal para la edición y gestión de contenido.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/doomemacs/doomemacs&quot;&gt;Doom Emacs&lt;/a&gt;&lt;/strong&gt;: Una configuración avanzada que potencia las capacidades de Emacs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://orgmode.org/&quot;&gt;Org-mode&lt;/a&gt;&lt;/strong&gt;: El motor de organización y exportación que utilizo para estructurar cada artículo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://astro.build/&quot;&gt;Astro&lt;/a&gt;&lt;/strong&gt;: El framework moderno que da vida a este sitio, garantizando un rendimiento excepcional y una experiencia de usuario fluida.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inteligencia Artificial&lt;/strong&gt;: Utilizo herramientas de IA generativa para la creación de las imágenes y portadas que acompañan cada artículo, permitiéndome ilustrar conceptos de forma visualmente atractiva.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Próximos pasos&lt;/h2&gt;
&lt;p&gt;Mi compromiso es mantener una regularidad en las publicaciones, utilizando este espacio también como una herramienta para perfeccionar mi capacidad de redacción técnica. Tengo en mente varios tutoriales y artículos sobre desarrollo que espero publicar próximamente.&lt;/p&gt;
&lt;hr /&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Documentando el camino, una línea de código a la vez.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Raksodiano&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><enclosure url="https://raksodiano.github.io/un-dev-mas/_astro/blog-post-2026-02-28.CaWk5d-4_Z2fD93F.webp" length="0" type="image/jpeg"/></item><item><title>Tutorial Bash I</title><link>https://raksodiano.github.io/2026/03/01/tutorial-bash-i</link><guid isPermaLink="true">https://raksodiano.github.io/2026/03/01/tutorial-bash-i</guid><description>Una guía fundamental sobre Bash: desde su definición como intérprete y lenguaje de scripting hasta la gestión básica de variables y entrada/salida de datos.</description><pubDate>Sun, 01 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Introducción&lt;/h2&gt;
&lt;p&gt;Bienvenidos a esta guía introductoria sobre &lt;strong&gt;Bash&lt;/strong&gt;. Contrario a lo que se suele pensar, Bash no es solo una &lt;a href=&quot;https://es.wikipedia.org/wiki/Shell_(inform%C3%A1tica)&quot;&gt;shell&lt;/a&gt;, sino también un potente lenguaje de scripting. Esta versatilidad lo convierte en una herramienta esencial para cualquier desarrollador o administrador de sistemas.&lt;/p&gt;
&lt;p&gt;A lo largo de este artículo, encontrarán enlaces a recursos externos como Wikipedia. Considero que desarrollar la capacidad de investigación y lectura crítica es fundamental en el ámbito de la informática y el desarrollo de software.&lt;/p&gt;
&lt;h2&gt;¿Qué es Bash?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Bash&lt;/strong&gt; es un intérprete de comandos para sistemas &lt;strong&gt;Unix/Linux&lt;/strong&gt;, además de un lenguaje de scripting que permite interactuar con el sistema operativo mediante instrucciones escritas en la terminal. Fue desarrollado por &lt;a href=&quot;https://es.wikipedia.org/wiki/Brian_Fox_(programador)&quot;&gt;Brian Fox&lt;/a&gt; para el proyecto &lt;a href=&quot;https://es.wikipedia.org/wiki/Proyecto_GNU&quot;&gt;GNU&lt;/a&gt;, con el objetivo de reemplazar al clásico shell &lt;a href=&quot;https://es.wikipedia.org/wiki/Bourne_Shell&quot;&gt;Bourne&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Su nombre es un acrónimo de &lt;em&gt;Bourne-again shell&lt;/em&gt;, un juego de palabras que hace referencia al shell que sustituye y al concepto de &quot;renacimiento&quot; (&lt;em&gt;Born-again&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bash&lt;/strong&gt; es el intérprete predeterminado en la gran mayoría de las distribuciones GNU/Linux y ofrece una amplia gama de funcionalidades:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Compatibilidad con el shell tradicional &lt;a href=&quot;https://es.wikipedia.org/wiki/Bourne_Shell&quot;&gt;Bourne&lt;/a&gt; (sh).&lt;/li&gt;
&lt;li&gt;Capacidad para ejecutar comandos, desarrollar scripts complejos, gestionar procesos y personalizar el entorno de ejecución.&lt;/li&gt;
&lt;li&gt;Características avanzadas como autocompletado, historial de comandos extendido, gestión de variables, funciones y control de trabajos (&lt;em&gt;job control&lt;/em&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Formas de uso: Interactivo vs. No interactivo&lt;/h2&gt;
&lt;p&gt;Podemos distinguir dos modos principales de operación en &lt;strong&gt;Bash&lt;/strong&gt;: el modo &lt;strong&gt;interactivo&lt;/strong&gt; y el &lt;strong&gt;no interactivo&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;Modo interactivo&lt;/h3&gt;
&lt;p&gt;Es el modo que empleamos al introducir comandos manualmente desde la terminal, ejecutándolos uno por uno. Por ejemplo:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;[usuario@localhost ~]$ ls -la
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Modo no interactivo&lt;/h3&gt;
&lt;p&gt;En este modo, Bash ejecuta una serie de instrucciones predefinidas en un archivo (script). El script se ejecuta de forma secuencial sin requerir intervención constante del usuario. Por ejemplo:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;[usuario@localhost ~]$ ./build_project.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Creación de tu primer script&lt;/h2&gt;
&lt;p&gt;Para comenzar, utilizaremos un editor de texto plano. Puedes elegir cualquiera que esté disponible en tu sistema, como &lt;strong&gt;Vim&lt;/strong&gt;, &lt;strong&gt;Nano&lt;/strong&gt;, o incluso editores con interfaz gráfica si lo prefieres.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Recomendación&lt;/strong&gt;: Es buena práctica organizar tus scripts en un directorio específico y utilizar la extensión &lt;code&gt;.sh&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Mantener un entorno de trabajo ordenado facilita la gestión de tus proyectos y evita la pérdida de archivos.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ejemplo de estructura inicial&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;mkdir -p Workspace/scripts/bash    # Creación del directorio
cd Workspace/scripts/bash          # Cambio al directorio de trabajo
touch primer_script.sh             # Creación del archivo de script
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nota&lt;/strong&gt;: Para que un archivo sea ejecutable, es necesario asignarle los permisos adecuados:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;chmod +x primer_script.sh       # Asigna permisos de ejecución
./primer_script.sh              # Ejecución del script
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Estructura básica: El Shebang&lt;/h3&gt;
&lt;p&gt;Todo script de Bash debe comenzar con el &lt;strong&gt;shebang&lt;/strong&gt; (&lt;code&gt;#!&lt;/code&gt;), seguido de la ruta al intérprete. Esto indica al sistema operativo qué programa debe usar para procesar las instrucciones del archivo.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nota Técnica&lt;/strong&gt;: Existen otros intérpretes disponibles, cada uno con sus propias características y limitaciones:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;#!/bin/sh    # Bourne Shell (estándar básico)
#!/bin/zsh   # Z Shell (extensión de Bash con extras)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Por consistencia en este tutorial, nos enfocaremos exclusivamente en &lt;strong&gt;Bash&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Ejemplo: Hola Mundo&lt;/h3&gt;
&lt;p&gt;A continuación, presentamos un ejemplo básico que muestra texto en la terminal:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash

echo &quot;Hola Mundo&quot;

# Salida: Hola Mundo
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Fundamentos de Programación en Bash&lt;/h2&gt;
&lt;p&gt;Dominar un lenguaje requiere comprender sus pilares fundamentales. A continuación, exploraremos los conceptos esenciales para construir scripts robustos.&lt;/p&gt;
&lt;h3&gt;Comentarios&lt;/h3&gt;
&lt;p&gt;Los comentarios son vitales para la documentación del código. El intérprete los ignora durante la ejecución, permitiendo a los desarrolladores incluir explicaciones sobre la lógica implementada.&lt;/p&gt;
&lt;p&gt;Una buena práctica de documentación facilita el mantenimiento del script a largo plazo.&lt;/p&gt;
&lt;h4&gt;Comentarios de una sola línea&lt;/h4&gt;
&lt;p&gt;Se utiliza el carácter &lt;code&gt;#&lt;/code&gt;. Todo lo que se escriba después de este símbolo en la misma línea será ignorado.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash

# Este es un comentario que describe la función del script
echo &quot;Hola Mundo&quot; # También se pueden añadir comentarios al final de una instrucción
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Comentarios multi-línea (HereDoc)&lt;/h4&gt;
&lt;p&gt;Aunque Bash no dispone de una sintaxis nativa para comentarios multi-línea como otros lenguajes, se puede emplear la técnica &lt;strong&gt;HereDoc&lt;/strong&gt; (&lt;code&gt;&amp;lt;&amp;lt;&lt;/code&gt;) para este fin. Esta técnica permite redirigir bloques de texto. Si no se asocia a ningún comando, el bloque actúa como un comentario.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash

&amp;lt;&amp;lt; &apos;COMMENT&apos;
Este bloque de texto
actúa como un comentario
de varias líneas.
COMMENT

echo &quot;Ejecución del script&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Por convención, se suelen utilizar delimitadores en mayúsculas como &lt;code&gt;EOF&lt;/code&gt; o &lt;code&gt;COMMENT&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;Variables&lt;/h3&gt;
&lt;p&gt;Las variables son contenedores para almacenar datos que serán utilizados a lo largo del script. En Bash, hay reglas importantes para su definición:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Nombres&lt;/strong&gt;: Deben comenzar con una letra o guion bajo (&lt;code&gt;_&lt;/code&gt;). No pueden empezar con números ni contener caracteres especiales (excepto el guion bajo).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sensibilidad a mayúsculas (&lt;em&gt;Case Sensitive&lt;/em&gt;)&lt;/strong&gt;: Bash distingue entre &lt;code&gt;mi_variable&lt;/code&gt; y &lt;code&gt;MI_VARIABLE&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Asignación&lt;/strong&gt;: No debe haber espacios alrededor del signo igual (&lt;code&gt;=&lt;/code&gt;).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ejemplo de uso:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash

# Declaración y asignación
mensaje=&quot;Hola&quot;

# Uso de la variable mediante el símbolo $
echo $mensaje

# Salida: Hola
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nota&lt;/strong&gt;: Utilizar nombres descriptivos mejora la legibilidad. Aquí algunos estándares comunes:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 📌 Variables de entorno (en MAYÚSCULAS por convención)
LOGNAME=&quot;admin&quot;
BASE_PATH=&quot;/var/www/html&quot;

# 🧪 Variables locales (snake_case)
nombre_archivo=&quot;reporte_ventas.txt&quot;
contador_usuarios=10
es_valido=true

# 🧩 Variables de configuración (prefijo CFG_)
CFG_TIMEOUT=30
CFG_RETRY_LIMIT=5

# 🔁 Variables especiales del sistema
echo &quot;Nombre del script: $0&quot;
echo &quot;Número de argumentos: $#&quot;
echo &quot;Lista de argumentos: $@&quot;

# 🧾 Variables posicionales (argumentos recibidos)
primer_argumento=$1
segundo_argumento=$2

# 🔒 Constantes (mediante comando readonly)
readonly VERSION_APP=&quot;1.2.0&quot;
readonly MAX_CONEXIONES=100

# 🐚 Exportación para subprocesos
export API_KEY=&quot;a1b2c3d4e5f6&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nota&lt;/strong&gt;: Bash es de tipado dinámico, lo que significa que una variable puede cambiar el tipo de dato que contiene durante la ejecución. Sin embargo, para mantener la claridad y evitar errores lógicos, se recomienda ser consistente con el propósito de cada variable.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;datos=&quot;Texto inicial&quot;
echo $datos          # Salida: Texto inicial

datos=1024           # Válido, pero usar con precaución
echo $datos          # Salida: 1024
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Entrada y Salida de Datos&lt;/h3&gt;
&lt;p&gt;La interacción con el usuario y la presentación de resultados son fundamentales en cualquier script.&lt;/p&gt;
&lt;h4&gt;Mostrar Información al Usuario (&lt;code&gt;echo&lt;/code&gt;)&lt;/h4&gt;
&lt;p&gt;El comando &lt;code&gt;echo&lt;/code&gt; es la herramienta estándar para imprimir texto en la terminal.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash

# Uso básico
echo &quot;Este mensaje se muestra en pantalla.&quot;

# Impresión de variables (locales y de entorno)
echo &quot;Usuario actual: $USER&quot;
echo &quot;Directorio de trabajo: $PWD&quot;

# Eliminación del salto de línea final (-n)
echo -n &quot;Procesando... &quot;
echo &quot;Hecho.&quot;

# Interpretación de caracteres especiales (-e)
# \n: Salto de línea
# \t: Tabulación
echo -e &quot;Línea 1\nLínea 2\tDato tabulado&quot;

# Aplicación de formato (colores ANSI)
echo -e &quot;\e[32mOperación exitosa\e[0m&quot;

# Escape de caracteres (comillas dentro de comillas)
echo &quot;Ejecutando el comando \&quot;ls -la\&quot;&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Captura de Datos del Usuario (&lt;code&gt;read&lt;/code&gt;)&lt;/h4&gt;
&lt;p&gt;El comando &lt;code&gt;read&lt;/code&gt; permite que el script reciba información introducida por el usuario a través de la entrada estándar (teclado).&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash

echo &quot;Por favor, introduzca su nombre:&quot;
read nombre_usuario

echo &quot;Bienvenido, $nombre_usuario&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;El valor introducido se almacena dinámicamente en la variable especificada.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;: Para conocer más a fondo las opciones de estos comandos, puedes consultar los manuales del sistema:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;man echo
man read
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Conclusiones&lt;/h2&gt;
&lt;p&gt;Este artículo ha cubierto los fundamentos básicos de &lt;strong&gt;Bash&lt;/strong&gt;, desde su definición hasta la gestión elemental de variables y comandos de entrada/salida.&lt;/p&gt;
&lt;p&gt;La programación en Bash es una habilidad sumamente valiosa que permite automatizar tareas cotidianas y optimizar flujos de trabajo en entornos Linux. Aunque hemos abordado conceptos iniciales, la versatilidad de este lenguaje es inmensa.&lt;/p&gt;
&lt;p&gt;En próximas entregas, exploraremos estructuras de control, funciones y técnicas avanzadas de scripting. Espero que esta introducción les sea de gran utilidad en su camino de aprendizaje técnico.&lt;/p&gt;
&lt;p&gt;¡Hasta la próxima! 🐧✨&lt;/p&gt;
</content:encoded><enclosure url="https://raksodiano.github.io/un-dev-mas/_astro/blog-post-2026-03-01.CzspSl2U_ZAis5g.webp" length="0" type="image/jpeg"/></item><item><title>Tutorial Bash II: Operadores, Condicionales y Bucles</title><link>https://raksodiano.github.io/2026/03/08/tutorial-bash-ii</link><guid isPermaLink="true">https://raksodiano.github.io/2026/03/08/tutorial-bash-ii</guid><description>Aprende los operadores, estructuras condicionales y bucles en Bash para crear scripts más complejos y automatizar tareas en Linux.</description><pubDate>Sun, 08 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Introducción&lt;/h2&gt;
&lt;p&gt;En este tutorial continuamos explorando &lt;strong&gt;Bash&lt;/strong&gt;, profundizando en aspectos fundamentales del scripting: operadores, estructuras condicionales y bucles. Estos elementos son esenciales para escribir scripts robustos y automatizar tareas en sistemas Unix/Linux.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;La curiosidad es el motor del aprendizaje. Cada problema resuelto te acerca un paso más a dominar Bash.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Operadores&lt;/h2&gt;
&lt;p&gt;En Bash tenemos operadores matemáticos, de comparación y lógicos. Estos nos permiten realizar diversas validaciones según los distintos escenarios que puedan surgir en nuestros scripts.&lt;/p&gt;
&lt;h3&gt;Operadores Matemáticos&lt;/h3&gt;
&lt;p&gt;Usados para realizar operaciones aritméticas básicas.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Nombre&lt;/th&gt;
&lt;th&gt;Operador&lt;/th&gt;
&lt;th&gt;Ejemplo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Suma&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;echo $(( 1 + 1 ))&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resta&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;echo $(( 1 - 1 ))&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multiplicación&lt;/td&gt;
&lt;td&gt;*&lt;/td&gt;
&lt;td&gt;echo $(( 2 * 2 ))&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;División&lt;/td&gt;
&lt;td&gt;/&lt;/td&gt;
&lt;td&gt;echo $(( 10 / 2 ))&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Módulo&lt;/td&gt;
&lt;td&gt;%&lt;/td&gt;
&lt;td&gt;echo $(( 5 % 2 ))&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Potencia&lt;/td&gt;
&lt;td&gt;**&lt;/td&gt;
&lt;td&gt;echo $(( 2 ** 3 ))&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Incremento&lt;/td&gt;
&lt;td&gt;++&lt;/td&gt;
&lt;td&gt;((x++))&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Decremento&lt;/td&gt;
&lt;td&gt;--&lt;/td&gt;
&lt;td&gt;((x--))&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Operadores de Comparación&lt;/h3&gt;
&lt;p&gt;Usados para comparar números o cadenas, comúnmente en estructuras condicionales.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Nombre&lt;/th&gt;
&lt;th&gt;Operador&lt;/th&gt;
&lt;th&gt;Ejemplo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Igual&lt;/td&gt;
&lt;td&gt;-eq&lt;/td&gt;
&lt;td&gt;[ &quot;$a&quot; -eq &quot;$b&quot; ]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Distinto&lt;/td&gt;
&lt;td&gt;-ne&lt;/td&gt;
&lt;td&gt;[ &quot;$a&quot; -ne &quot;$b&quot; ]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Menor que&lt;/td&gt;
&lt;td&gt;-lt&lt;/td&gt;
&lt;td&gt;[ &quot;$a&quot; -lt &quot;$b&quot; ]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Menor o igual&lt;/td&gt;
&lt;td&gt;-le&lt;/td&gt;
&lt;td&gt;[ &quot;$a&quot; -le &quot;$b&quot; ]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mayor que&lt;/td&gt;
&lt;td&gt;-gt&lt;/td&gt;
&lt;td&gt;[ &quot;$a&quot; -gt &quot;$b&quot; ]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mayor o igual&lt;/td&gt;
&lt;td&gt;-ge&lt;/td&gt;
&lt;td&gt;[ &quot;$a&quot; -ge &quot;$b&quot; ]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Operadores Lógicos&lt;/h3&gt;
&lt;p&gt;Permiten combinar múltiples condiciones.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Nombre&lt;/th&gt;
&lt;th&gt;Operador&lt;/th&gt;
&lt;th&gt;Ejemplo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Negación&lt;/td&gt;
&lt;td&gt;!&lt;/td&gt;
&lt;td&gt;[ ! &quot;$a&quot; = &quot;$b&quot; ]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AND&lt;/td&gt;
&lt;td&gt;-a&lt;/td&gt;
&lt;td&gt;[ &quot;$a&quot; -gt 5 -a &quot;$b&quot; -lt 10 ]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OR&lt;/td&gt;
&lt;td&gt;-o&lt;/td&gt;
&lt;td&gt;[ &quot;$a&quot; -gt 5 -o &quot;$b&quot; -lt 10 ]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Condicionales&lt;/h2&gt;
&lt;p&gt;Las estructuras condicionales permiten que tus scripts tomen decisiones basadas en si una condición es verdadera o falsa.&lt;/p&gt;
&lt;h3&gt;if&lt;/h3&gt;
&lt;p&gt;El comando &lt;strong&gt;if&lt;/strong&gt; se utiliza para evaluar condiciones dentro de un script. Si la condición es verdadera, se ejecuta el bloque de código contenido en el &lt;strong&gt;if&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;La sintaxis básica es:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;if [ condición ]; then
   # instrucciones si la condición es verdadera
fi
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Ejemplo práctico:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash

echo -n &quot;Ingresa tu edad: &quot;
read edad

if [ $edad -gt 17 ]; then
  echo &quot;Eres mayor de edad&quot;
fi

echo &quot;Fin del script&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;else&lt;/h3&gt;
&lt;p&gt;El &lt;strong&gt;else&lt;/strong&gt; permite ejecutar otro bloque de código cuando la condición anterior no se cumple.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;if [ condición ]; then
   # instrucciones si la condición es verdadera
else
   # instrucciones si es falsa
fi
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash

echo -n &quot;Ingresa tu edad: &quot;
read edad

if [ $edad -gt 17 ]; then
  echo &quot;Eres mayor de edad&quot;
else
  echo &quot;Eres menor de edad&quot;
fi

echo &quot;Fin del script&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;elif&lt;/h3&gt;
&lt;p&gt;El &lt;strong&gt;elif&lt;/strong&gt; evalúa una nueva condición cuando la anterior no se cumple, permitiendo validar múltiples condiciones de manera secuencial.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;if [ condición1 ]; then
    # si condición1 es verdadera
elif [ condición2 ]; then
    # si condición2 es verdadera
else
    # si ninguna se cumple
fi
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash

echo -n &quot;Ingresa tu edad: &quot;
read edad

if [ $edad -lt 0 ]; then
  echo &quot;La edad no puede ser negativa&quot;

elif [ $edad -gt 17 -a $edad -lt 60 ]; then
  echo &quot;Eres mayor de edad&quot;

elif [ $edad -ge 60 ]; then
  echo &quot;Eres adulto mayor&quot;

else
  echo &quot;Eres menor de edad&quot;
fi

echo &quot;Fin del script&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;case&lt;/h3&gt;
&lt;p&gt;La estructura &lt;strong&gt;case&lt;/strong&gt; permite realizar comparaciones de patrones. Se define una variable y los diferentes valores que puede tomar.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;case $variable in
  patron1)
    # instrucciones
    ;;
  patron2)
    # instrucciones
    ;;
  *)
    # por defecto
    ;;
esac
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash

echo -n &quot;Ingresa el nombre de un animal: &quot;
read animal

case $animal in
  &quot;gato&quot;)
    echo &quot;Es un felino doméstico&quot;
    ;;
  &quot;perro&quot;)
    echo &quot;Es el mejor amigo del hombre&quot;
    ;;
  &quot;oso&quot;)
    echo &quot;Es un animal salvaje&quot;
    ;;
  *)
    echo &quot;Animal no reconocido&quot;
    ;;
esac
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nota&lt;/strong&gt;: Las comparaciones en &lt;strong&gt;case&lt;/strong&gt; son sensibles a mayúsculas y minúsculas. &quot;gato&quot;, &quot;Gato&quot; y &quot;GATO&quot; son valores diferentes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Bucles&lt;/h2&gt;
&lt;p&gt;Los bucles son estructuras que permiten ejecutar un bloque de comandos repetidamente mientras se cumpla una condición. Son fundamentales para automatizar tareas repetitivas.&lt;/p&gt;
&lt;h3&gt;For&lt;/h3&gt;
&lt;p&gt;El bucle &lt;strong&gt;for&lt;/strong&gt; recorre una lista o un rango, ejecutando el mismo bloque de código para cada elemento.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;for variable in lista/rango
do
  # instrucciones
done
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Ejemplo - Recorrer una lista:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash

animales=&quot;perro gato conejo elefante tigre&quot;

for animal in $animales
do
  echo &quot;Animal: $animal&quot;
done
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Ejemplo - Recorrer un rango:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash

for i in {1..10}
do
  echo &quot;Iteración: $i&quot;
done
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;While&lt;/h3&gt;
&lt;p&gt;El bucle &lt;strong&gt;while&lt;/strong&gt; se ejecuta mientras una condición sea verdadera. Es útil cuando no sabemos de antemano cuántas veces necesitamos iterar.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;while [ condición ]
do
  # instrucciones
done
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash

i=1

while [ $i -le 10 ]
do
  echo &quot;Hola x$i&quot;
  ((i++))
done
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Until&lt;/h3&gt;
&lt;p&gt;El bucle &lt;strong&gt;until&lt;/strong&gt; es similar a &lt;strong&gt;while&lt;/strong&gt;, pero se ejecuta hasta que la condición sea verdadera (es decir, mientras la condición sea falsa).&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;until [ condición ]
do
  # instrucciones
done
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash

i=1

until [ $i -ge 11 ]
do
  echo &quot;Hola x$i&quot;
  ((i++))
done
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Control de Bucles&lt;/h3&gt;
&lt;p&gt;Los bucles infinitos pueden surgir si la condición nunca se cumple. Por fortuna, existen herramientas para controlarlos.&lt;/p&gt;
&lt;h4&gt;Break&lt;/h4&gt;
&lt;p&gt;La instrucción &lt;strong&gt;break&lt;/strong&gt; permite salir del bucle antes de que termine normalmente.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash

i=1

while [ true ]; do
  echo &quot;Número: $i&quot;

  if [ $i -eq 5 ]; then
    echo &quot;¡Llegamos a 5! Terminando...&quot;
    break
  fi

  ((i++))
done
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Información&lt;/strong&gt;: Para detener un bucle infinito manualmente, usa &lt;code&gt;Ctrl + C&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;Continue&lt;/h4&gt;
&lt;p&gt;La instrucción &lt;strong&gt;continue&lt;/strong&gt; salta la iteración actual y pasa a la siguiente.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash

i=1

until [ $i -gt 10 ]; do
  if [ $i -eq 5 ]; then
    ((i++))
    continue
  fi

  echo &quot;Número: $i&quot;
  ((i++))
done
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Información&lt;/strong&gt;: En el ejemplo anterior, la línea &lt;code&gt;Número: 5&lt;/code&gt; no aparecerá porque se salta esa iteración.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;En este tutorial cubrimos los operadores matemáticos, de comparación y lógicos en Bash, junto con las estructuras condicionales (&lt;code&gt;if&lt;/code&gt;, &lt;code&gt;else&lt;/code&gt;, &lt;code&gt;elif&lt;/code&gt;, &lt;code&gt;case&lt;/code&gt;) y los diferentes tipos de bucles (&lt;code&gt;for&lt;/code&gt;, &lt;code&gt;while&lt;/code&gt;, &lt;code&gt;until&lt;/code&gt;), incluyendo el control de flujo con &lt;code&gt;break&lt;/code&gt; y &lt;code&gt;continue&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Estos fundamentos te permitirán escribir scripts más complejos y automatizar tareas de manera eficiente. Te invito a practicar con los ejemplos proporcionados y a experimentar por tu cuenta.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Pensamiento final&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Que tus scripts siempre encuentren su &lt;code&gt;PATH&lt;/code&gt;,
y que jamás te falte un buen &lt;code&gt;grep&lt;/code&gt; para encontrar sentido entre las líneas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Recuerda:&lt;/strong&gt; &lt;em&gt;&quot;Benditos sean los que comparten su código, porque de ellos será el reino del software libre&quot;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><enclosure url="https://raksodiano.github.io/un-dev-mas/_astro/blog-post-2026-03-01.CzspSl2U_ZAis5g.webp" length="0" type="image/jpeg"/></item><item><title>Tutorial Bash III: Funciones, Argumentos y Manejo de Errores</title><link>https://raksodiano.github.io/2026/03/15/tutorial-bash-iii</link><guid isPermaLink="true">https://raksodiano.github.io/2026/03/15/tutorial-bash-iii</guid><description>Aprende a crear funciones, manejar argumentos y controlar errores en Bash para escribir scripts robustos y reutilizables.</description><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Introducción&lt;/h2&gt;
&lt;p&gt;En este tutorial continuamos nuestra serie sobre &lt;strong&gt;Bash&lt;/strong&gt;, explorando conceptos esenciales para escribir scripts más sofisticados y profesionales: funciones, manejo de argumentos y control de errores. Estos temas te permitirá crear scripts reutilizables, interactivos y confiables.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;La curiosidad es el motor del aprendizaje. Cada problema resuelto te acerca un paso más a dominar Bash.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Funciones&lt;/h2&gt;
&lt;p&gt;Las funciones son bloques de código reutilizables que nos permiten definir una lógica una sola vez y ejecutarla las veces que sean necesarias dentro de nuestros scripts. Estas funciones nos permiten estructurar mejor nuestro código, evitando la repetición y facilitando el mantenimiento.&lt;/p&gt;
&lt;p&gt;En Bash tenemos dos formas de definir funciones:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;function nombre_funcion {
  # instrucciones
}

nombre_funcion() {
  # instrucciones
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Como podemos ver, dentro de las llaves &lt;code&gt;{}&lt;/code&gt; definimos el bloque de código que se ejecutará cuando llamemos a la función. Dentro de las mismas podemos utilizar todo lo que hemos visto en los tutoriales anteriores.&lt;/p&gt;
&lt;h3&gt;Ejemplo práctico&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash

# Definimos la función
function saludar {
  echo &quot;Hola, esta es mi primera función&quot;
}

# Llamado de la función
saludar
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash

mensaje() {
  echo &quot;Esta es una función&quot;
}

mensaje
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nota&lt;/strong&gt;: Las funciones deben definirse antes de llamarse en el script.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Manejo de Argumentos&lt;/h2&gt;
&lt;p&gt;En Bash podemos utilizar argumentos para hacer nuestros scripts interactivos y reutilizables, permitiéndole al usuario pasar datos al momento de ejecutar el script.&lt;/p&gt;
&lt;h3&gt;Variables Especiales para Argumentos&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Variable&lt;/th&gt;
&lt;th&gt;Descripción&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;Nombre del script&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$1&lt;/td&gt;
&lt;td&gt;Primer argumento&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$2&lt;/td&gt;
&lt;td&gt;Segundo argumento&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$#&lt;/td&gt;
&lt;td&gt;Número de argumentos enviados&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$*&lt;/td&gt;
&lt;td&gt;Todos los argumentos como una cadena&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$@&lt;/td&gt;
&lt;td&gt;Todos los argumentos como array&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash

echo &quot;Nombre del script: $0&quot;
echo &quot;Primer argumento: $1&quot;
echo &quot;Segundo argumento: $2&quot;
echo &quot;Número de argumentos: $#&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Ejemplo de uso:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;./mi_script.sh argumento1 argumento2
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;: Para acceder a argumentos más allá del noveno, usa &lt;code&gt;${10}&lt;/code&gt;, &lt;code&gt;${11}&lt;/code&gt;, etc.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Entrada del Usuario&lt;/h3&gt;
&lt;p&gt;También podemos solicitar información directamente al usuario mediante el comando &lt;code&gt;read&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash

echo -n &quot;¿Cómo te llamas? &quot;
read nombre

echo &quot;Hola, $nombre&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Control de Errores&lt;/h2&gt;
&lt;p&gt;El manejo de errores en Bash es fundamental para crear scripts confiables y fáciles de mantener.&lt;/p&gt;
&lt;h3&gt;set&lt;/h3&gt;
&lt;p&gt;La orden &lt;code&gt;set&lt;/code&gt; permite modificar el comportamiento del script para detectar errores automáticamente.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash

set -x           # Imprime cada comando antes de ejecutarlo (debug)
set -e           # Termina el script si algún comando falla (exit != 0)
set -u           # Termina si usas una variable no definida
set -o pipefail  # Falla si algún comando en un pipeline falla
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Recomendación&lt;/strong&gt;: Usa &lt;code&gt;set -euo pipefail&lt;/code&gt; al inicio de tus scripts para mayor robustez.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash

set -euo pipefail
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Información&lt;/strong&gt;: La opción &lt;code&gt;-x&lt;/code&gt; es útil para depuración, pero debe quitarse en producción ya que genera mucha salida.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;trap&lt;/h3&gt;
&lt;p&gt;El comando &lt;code&gt;trap&lt;/code&gt; nos permite capturar señales del sistema o errores y ejecutar acciones específicas cuando ocurren. Es muy útil para limpiar archivos temporales o manejar interrupciones.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Capturar errores:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash

set -e

trap &apos;echo &quot;Ocurrió un error&quot;; exit 1&apos; ERR
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Capturar interrupción (Ctrl+C):&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash

set -e

trap &apos;echo &quot;Script interrumpido por el usuario&quot;; exit 2&apos; INT
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Ejemplo combinado:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash

set -euo pipefail

trap &apos;echo &quot;Ocurrió un error inesperado&quot;; exit 1&apos; ERR
trap &apos;echo &quot;Script interrumpido&quot;; exit 2&apos; INT

echo &quot;Iniciando script...&quot;
sleep 3

# Forzar un error
false

echo &quot;Esto no se mostrará&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Información&lt;/strong&gt;: Si dejas el script correr, el error (código 1) se ejecutará después de 3 segundos. Si lo cancelas con &lt;code&gt;Ctrl + C&lt;/code&gt; antes, ejecutará la señal de interrupción (código 2).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Verificar el Código de Salida&lt;/h3&gt;
&lt;p&gt;Podemos verificar manualmente el código de salida de los comandos:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash

cp archivo.txt /ruta/de/destino
if [ $? -ne 0 ]; then
  echo &quot;Error al copiar el archivo&quot;
  exit 1
fi
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O de forma más concisa usando el operador &lt;code&gt;||&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash

cp archivo.txt /ruta/destino || {
  echo &quot;Error al copiar el archivo&quot;
  exit 1
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Funciones con Códigos de Error&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash

descargar_archivo() {
  curl -O &quot;$1&quot; || return 1
}

descargar_archivo &quot;https://www.ejemplo.com&quot; || {
  echo &quot;Error al descargar el archivo&quot;
  exit 1
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;En este tutorial cubrimos tres temas fundamentales para escribir scripts profesionales en Bash:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Funciones&lt;/strong&gt;: Para reutilizar código y estructurar mejor nuestros scripts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Argumentos&lt;/strong&gt;: Para hacer nuestros scripts interactivos&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Control de errores&lt;/strong&gt;: Para crear scripts confiables y robustos&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Estos conceptos te permitirán crear scripts más complejos y automatizar tareas de manera eficiente. Te invito a practicar con los ejemplos proporcionados y a experimentar por tu cuenta.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Recuerda:&lt;/strong&gt; &lt;em&gt;&quot;Benditos sean los que comparten su código, porque de ellos será el reino del software libre&quot;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><enclosure url="https://raksodiano.github.io/un-dev-mas/_astro/blog-post-2026-03-01.CzspSl2U_ZAis5g.webp" length="0" type="image/jpeg"/></item><item><title>NeoIPTV: Mi camino aprendiendo Python con un reproductor de IPTV</title><link>https://raksodiano.github.io/2026/03/21/neo-iptv</link><guid isPermaLink="true">https://raksodiano.github.io/2026/03/21/neo-iptv</guid><description>Cómo creé mi propio reproductor de IPTV con Python, PyQt6 y MPV, y lo que aprendí en el proceso.</description><pubDate>Sat, 21 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Introducción&lt;/h2&gt;
&lt;p&gt;Si me conocés, sabés que me gusta experimentar con tecnologías nuevas. Hace un tiempo decidí dedicarme de lleno en &lt;a href=&quot;https://www.python.org/&quot;&gt;Python&lt;/a&gt;, un lenguaje que ya había visto antes, pero nunca de forma seria (solo algún script de prueba o pequeños experimentos sueltos).&lt;/p&gt;
&lt;p&gt;Los típicos ejercicios de aprendizaje los conocía de memoria: calculadoras, sistemas de gestión de tareas, pequeños &lt;a href=&quot;https://es.wikipedia.org/wiki/Web_scraping&quot;&gt;scrapers&lt;/a&gt;... nada que me emocionara realmente. Quería construir algo con lo que pudiera interactuar a diario, algo más allá del código por el código.&lt;/p&gt;
&lt;p&gt;Estaba viendo una publicidad de &lt;strong&gt;&lt;a href=&quot;https://pluto.tv/&quot;&gt;Pluto TV&lt;/a&gt;&lt;/strong&gt; cuando se me encendió el foco: ¿por qué no hacer mi propia versión? IPTV era un mundo completamente nuevo para mí (no tenía ni idea de qué era un playlist &lt;a href=&quot;https://en.wikipedia.org/wiki/M3U&quot;&gt;M3U&lt;/a&gt;, cómo funcionaba el streaming, ni mucho menos cómo manejarlo desde Python). Pero precisamente eso era lo que me atraía: aprender algo desde cero.&lt;/p&gt;
&lt;p&gt;Y así nació &lt;strong&gt;NeoIPTV&lt;/strong&gt;: un reproductor de IPTV construido con Python, &lt;a href=&quot;https://www.riverbankcomputing.com/software/pyqt/&quot;&gt;PyQt6&lt;/a&gt; y &lt;a href=&quot;https://mpv.io/&quot;&gt;MPV&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;De Pluto TV a IPTV&lt;/h2&gt;
&lt;p&gt;Estuve investigando un poco más sobre qué era Pluto TV y cómo funcionaba, y fue ahí donde me topé con el término de &lt;strong&gt;IPTV&lt;/strong&gt; (Internet Protocol Television). Eso me llevó a buscar y encontrar un sinfín de aplicaciones web que ofrecían este servicio. También descubrí un repositorio muy interesante: &lt;a href=&quot;https://github.com/iptv-org/iptv&quot;&gt;iptv-org/iptv&lt;/a&gt;, donde se encuentran muchos canales bajo licencia GPL (y otros sin ella).&lt;/p&gt;
&lt;p&gt;Eso me llevó a estudiar más sobre los archivos &lt;strong&gt;M3U&lt;/strong&gt;, que ya había visto antes en VLC pero a los que no les había dado mayor importancia. Una vez que entendí estos puntos, ya sabía lo que quería y cómo lo quería: una aplicación donde poder ver &quot;televisión&quot; por internet, escuchar música y tener mi propia lista de canales, totalmente controlada por mí. Y como no podía ser de otra manera, quería que fuera &lt;strong&gt;software libre&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;La decisión estética&lt;/h2&gt;
&lt;p&gt;Paralelamente a todo esto, quería que la aplicación fuera atractiva visualmente. ¿Qué mejor que ir por las librerías &lt;strong&gt;Qt&lt;/strong&gt;? No soy muy fan de &lt;strong&gt;GTK&lt;/strong&gt;, y aunque estuve mirando &lt;strong&gt;Tkinter&lt;/strong&gt; de Python, que tiene herramientas muy buenas para crear interfaces bonitas y estilizadas, mis gustos no me permitieron darme el lujo de aceptarla. Así que tomé la decisión meramente estética de que se viera bien en mis sistemas, en donde siempre instalo &lt;strong&gt;KDE&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;La cuestión de los datos&lt;/h2&gt;
&lt;p&gt;En esos momentos, ya sabiendo qué quería visualmente y que el lenguaje sería Python (que estaba aprendiendo), me surgió otra pregunta: ¿cómo iba a manejar los datos? ¿Un archivo o una base de datos? Hice unas pruebas con un script de Python y me percaté de que usar un archivo para leerlo o actualizarlo era muy lento. Me parecía muy poco profesional usar un simple archivo, sobre todo porque soy muy quisquilloso y me gusta que mis aplicaciones puedan soportar grandes cantidades de datos y que se muevan con cierta elegancia. Así que me fui por una base de datos que ya conociera.&lt;/p&gt;
&lt;p&gt;Pensé inicialmente en &lt;strong&gt;MySQL&lt;/strong&gt;, pero era demasiado para dos o tres tablitas. Así que me fui por su hermanita menor: &lt;strong&gt;SQLite&lt;/strong&gt;. Esta es una base de datos embebida, lo que significa que no necesita un servidor externo; toda la información se guarda en un simple archivo, pero con la potencia de SQL. Es perfecta para aplicaciones de escritorio por su ligereza, no requiere configuración y funciona automáticamente con solo incluirla en el proyecto.&lt;/p&gt;
&lt;h2&gt;Los primeros pasos del desarrollo&lt;/h2&gt;
&lt;p&gt;Teniendo ya la base de datos, el lenguaje y la librería gráfica, comencé con el desarrollo de una interfaz algo tosca pero simple: una lista a la derecha con todos los canales, usando &lt;strong&gt;QVBoxLayout&lt;/strong&gt; y &lt;strong&gt;QListView&lt;/strong&gt;. En la parte inferior usé &lt;strong&gt;QHBoxLayout&lt;/strong&gt; y &lt;strong&gt;QWidget&lt;/strong&gt; para tener todos los botones abajo.&lt;/p&gt;
&lt;p&gt;Mientras leía la documentación y entendía cómo funcionaban los layouts en Qt, me percaté de algo importante: ¿dónde podría reproducir mis canales? ¿Python tiene algo para ello?&lt;/p&gt;
&lt;p&gt;Detuve mi desarrollo por unos días buscando e indagando cómo podría reproducir estos canales. Después de estudiar varios, me quedé con dos reproductores: &lt;strong&gt;VLC&lt;/strong&gt; y &lt;strong&gt;MPV&lt;/strong&gt;, ambos muy buenos. ¿Cuál me convenía más? Simplemente tomé la decisión de irme por &lt;strong&gt;MPV&lt;/strong&gt;, ya que su librería, aunque más simple que VLC y con documentación un poco más escasa, me servía porque no necesitaba algo tan pesado y completo como VLC.&lt;/p&gt;
&lt;p&gt;Aquí vinieron varios dolores de cabeza, ya que no sabía cómo hacer que MPV quedara dentro del frame de mi app, más específicamente dentro del &lt;strong&gt;QWidget&lt;/strong&gt; donde tenía que estar el reproductor. Después de casi 3 días de estar batallando con la documentación y prueba y error, me di cuenta de algo: ¿qué hago yo programando sin logs? Al ser un proyecto personal y fuera del horario laboral, estaba cansado y no había caído en cuenta de que no tenía logs y no sabía cuál era el error como tal de lo que ocurría.&lt;/p&gt;
&lt;p&gt;Así que implementé el módulo de logger, haciéndolo &quot;legible&quot; para mí, creando siempre su directorio y dejando los logs por 15 días para no estar batallando con los errores. Dejé una estructura muy similar a la que siempre manejo en mis aplicaciones, donde muestro la hora, el nivel de error/información/debugging y un mensaje que yo coloque, todo almacenado en mi directorio de logs con la fecha por nombre.&lt;/p&gt;
&lt;h2&gt;Base de datos e hilos&lt;/h2&gt;
&lt;p&gt;En este punto comencé con la implementación de dos cosas. Primero, la base de datos &lt;strong&gt;SQLite&lt;/strong&gt;, levantando las conexiones y estudiando también cómo Python trabaja con SQLite (ya que nunca había tocado SQLite). En este punto había descargado un par de archivos con canales para entender su estructura y crear un método para exportar los datos hacia SQLite. Maté dos pájaros de un tiro: desarrollé el método para cargar datos a la base mediante archivos y apliqué lo mismo para que previamente descargara el archivo desde una &lt;strong&gt;URL&lt;/strong&gt;, evitando tener los archivos dispersos en mis directorios.&lt;/p&gt;
&lt;p&gt;La segunda implementación fueron los &lt;strong&gt;hilos&lt;/strong&gt; en Python, ya que al unir la carga con la interfaz, esta se congelaba mientras se procesaban los archivos, que en ese momento tenían más de 13 mil canales. Para acelerar las cosas, preferí agregar hilos para procesar las cosas con mayor celeridad.&lt;/p&gt;
&lt;h2&gt;La primera prueba real&lt;/h2&gt;
&lt;p&gt;Para este punto, visualmente y funcionalmente era exactamente lo que había imaginado. La interfaz estaba lista, los botones respondían, la lista de canales se mostraba correctamente... pero no tenía canales para reproducir. Así que llegó el momento de la verdad: la primera prueba real.&lt;/p&gt;
&lt;p&gt;Hice uso del método para obtener todos los canales desde SQLite y probé también el rendimiento mientras se cargaban los más de 13 mil registros que tenía en mi base de datos. Hice que estos se mostraran en la lista del lado derecho, donde solo ajusté un poco el scrollbar para que se viera bien, y luego, tomando el primer elemento de esta lista, lo pasé directo al reproductor.&lt;/p&gt;
&lt;p&gt;Cuando vi que el primer canal comenzó a reproducirse después de 3 semanas de desarrollo, la sensación fue hermosa. Por primera vez podía ver un canal de televisión desde mi propia aplicación, con mi propia lista de canales, mis propios datos. Todo funcionaba.&lt;/p&gt;
&lt;h2&gt;Mejoras y el poder de la IA&lt;/h2&gt;
&lt;p&gt;Ya para este punto en el desarrollo, solo han venido mejoras, bugs y casos que han sido nuevos para mí. Python no es mi fuerte, por muy fácil que se diga que es; mi código no es el mejor ni mucho menos. Este proyecto lo tuve en pausa cerca de 9 meses, y hace poco lo retomé con la ayuda de la IA.&lt;/p&gt;
&lt;p&gt;Hice ajustes como cambiar un poco más la interfaz gráfica, agregar un buscador, mostrar el nombre del canal que se está viendo en el centro de los controles, resaltar el canal que se está reproduciendo, añadir favoritos, eliminar un canal, entre otras cosas que he ido agregando con la IA. En este punto, la IA me ha ayudado a avanzar a pasos agigantados este proyecto personal.&lt;/p&gt;
&lt;p&gt;Este proyecto me ha dejado un aprendizaje: solo tienes que tener las ganas de empezar, tomar tu tiempo para sacarlo adelante y, por muy poco tiempo que puedas dedicarle, es mejor que no hacer nada. Este proyecto me enseñó que salirse de los caminos conocidos (los mismos sistemas web, calculadoras, sistemas de gestión, inventarios) está bien para practicar, pero si realmente quieres aprender, rompe el molde. Busca otra cosa para hacer. No todo el tiempo deben ser estos proyectos de universidad o proyectos que te encuentras en un vídeo. Imagina lo que quieres y trata de hacerlo.&lt;/p&gt;
&lt;p&gt;Aquí aprendí muchas cosas: &lt;strong&gt;IPTV&lt;/strong&gt;, &lt;strong&gt;M3U&lt;/strong&gt;, un poco de &lt;strong&gt;Qt&lt;/strong&gt;, del reproductor &lt;strong&gt;MPV&lt;/strong&gt; (ahora lo uso incluso con &lt;strong&gt;Emacs&lt;/strong&gt; para mis feeds/rss), &lt;strong&gt;SQLite&lt;/strong&gt;, el manejo de &lt;strong&gt;hilos&lt;/strong&gt; de Python, que es muy interesante como lo trabaja. Aunque no tengo los términos o temas dominados del todo, me ha ayudado a comprender mejor a Python y sus diversas bondades.&lt;/p&gt;
&lt;p&gt;Y lo más importante: este proyecto sigue vivo. Si querés ver el código o contribuir, puedes encontrarlo en &lt;a href=&quot;https://github.com/raksodiano/neo-iptv&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;¡Hasta la próxima!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Recuerda:&lt;/strong&gt; &lt;em&gt;&quot;Benditos sean los que comparten su código, porque de ellos será el reino del software libre&quot;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><enclosure url="https://raksodiano.github.io/un-dev-mas/_astro/blog-post-2026-03-21.BGZsz2FV_Z1cPfUe.webp" length="0" type="image/jpeg"/></item><item><title>Presentación a la nueva sección</title><link>https://raksodiano.github.io/2026/03/27/presentacion</link><guid isPermaLink="true">https://raksodiano.github.io/2026/03/27/presentacion</guid><description>Notas, poemas, historias y demás escritos.</description><pubDate>Fri, 27 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Contexto&lt;/h2&gt;
&lt;p&gt;Desde hace un tiempo, estoy escribiendo un libro. Es algo que he tenido en mente por un buen rato y ahora mismo me encuentro en ese proceso. Aunque me doy cuenta de que mi forma de escribir es algo tosca y con falta de inmersión, por eso mismo quiero practicar más para mejorar y dedicarme de lleno al proyecto con más confianza.&lt;/p&gt;
&lt;p&gt;Hablando con una historiadora —una muy buena amiga—, me recomendó que escribiera más seguido para mejorar mi forma de escribir y que no todo tenía que ser &quot;para el libro&quot;. Me sugirió que crease un espacio donde practicar y compartir mis escritos, por más pequeños que fueran. Así nació esta sección.&lt;/p&gt;
&lt;p&gt;Me encanta investigar sobre criptidos, criaturas fantásticas, dioses de diferentes culturas, seres mitológicos e incluso teorías sobre seres de otros mundos. Esta pasión por lo desconocido y lo extraordinario me inspira a crear historias con mundos fantásticos donde la imaginación no tiene límites.&lt;/p&gt;
&lt;h2&gt;¿Por qué escribo?&lt;/h2&gt;
&lt;p&gt;La razón es sencilla: mi mente está ocupada todo el día programando, escribiendo documentación técnica, resolviendo errores y bugs, entre muchas cosas que mantienen mi mente en modo lógico y dejan poco espacio para la imaginación.&lt;/p&gt;
&lt;p&gt;Este pasatiempo me permite salir de la monotonía del código y relajarme en mis pensamientos e imaginación. En lugar de pasar horas en el scroll infinito de redes sociales, prefiero dedicar ese tiempo a escribir.&lt;/p&gt;
&lt;p&gt;Así que si te gusta lo extraño y lo fascinante, bienvenido a este pequeño espacio donde la imaginación es la protagonista y cada historia es una aventura.&lt;/p&gt;
</content:encoded><enclosure url="https://raksodiano.github.io/un-dev-mas/_astro/writings-post-2026-03-27.BpuuGDFY_Zh3Nkr.webp" length="0" type="image/jpeg"/></item><item><title>El Hambre que no se Sacia</title><link>https://raksodiano.github.io/2026/03/28/el-hambre-que-no-se-sacia</link><guid isPermaLink="true">https://raksodiano.github.io/2026/03/28/el-hambre-que-no-se-sacia</guid><description>Un relato de ficción sobre una maldición que transforma el hambre en algo insaciable. Un homenaje al Wendigo.</description><pubDate>Sat, 28 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Este relato es un pequeño homenaje al Wendigo, la criatura del folclore norteamericano cuyo tabú central es el canibalismo. Aunque en las culturas centro y suramericanas no encontré criaturas con características similares —los mitos precolombinos suelen presentar dioses o demonios que devoran humanos como parte de un castigo divino, no como una maldición personal y progresiva—, decidí crear mi propia interpretación para un libro donde el mundo mismo es el enemigo de la humanidad y los humanos se ven perjudicados de una u otra forma.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;El Relato&lt;/h2&gt;
&lt;p&gt;Elena llega a su casa cansada. Su clase fue exhaustiva; los alumnos no dejaron de discutir sobre lo visto en las noticias, sobre si era real, una edición o la publicidad de alguna película. Entregada a sus pensamientos —divisa el almuerzo que uno de sus colegas le regaló y comienza a comer—. La abrumadora jornada no le permite pensar en nada más.&lt;/p&gt;
&lt;p&gt;Se levanta de madrugada y, hambrienta, termina un litro de helado. Aún tiene hambre. Intenta controlarse y vuelve a dormir. Todo el día solo piensa en comer. Nada le sacia: ni la comida, ni el agua, ni los refrescos, ni el alcohol.&lt;/p&gt;
&lt;p&gt;Con el pasar de los días, mientras aguanta la ansiedad de comer, una voz profunda y oscura surge en su mente.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Tengo... hambre...&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;La voz susurra una y otra vez las mismas palabras. Trata de seguir su día con normalidad, pero no cesa. Come cada vez más, pero la voz no para. Las alucinaciones comenzaron: una sombra alargada aparecía en sus sueños, dedos largos como ramas la señalaban, y repitiendo aquellas palabras una y otra vez, mientras sentía que la sombra podía ver más allá de su ser.&lt;/p&gt;
&lt;p&gt;Los días pasaron, y con ellos, la desesperación de Elena creció. Ya no era solo hambre lo que sentía; era algo peor, algo que no podía nombrar. Comenzó a ver a sus alumnos de manera diferente. Los observaba en clase con otros ojos, como si no fueran estudiantes, sino... algo más.&lt;/p&gt;
&lt;p&gt;Sus miradas se detenían en sus cuellos, en sus muñecas, en la piel suave de los más jóvenes. Una lujuria nueva, voraz, se mezclaba con el apetito que no la dejaba en paz.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;«Son tan... tiernos»&lt;/em&gt; —pensaba, e inmediatamente se odiaba por pensarlo—.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Trataba de no quedarse a sola con nadie. Temía lo que pudiera hacer. La voz se repetía en su cabeza como un eco, susurrando que no solo era hambre lo que tenía. Era algo más antiguo, más oscuro. Y mientras más tiempo pasaba, más fuerte era el impulso de probar algo que nunca antes había cruzado su mente.&lt;/p&gt;
&lt;p&gt;Su cuerpo comenzó a deteriorarse: bajaba de peso drásticamente, no importaba lo que comiera o cuanto comiera. Y algo le indicó que lo peor apenas comenzaba.&lt;/p&gt;
&lt;p&gt;Los ataques de ansiedad llegaron sin aviso. Elena no podía concentrarse en nada: ni en sus clases, ni en preparar la comida, ni en dormir. Intentaba llamar a su pareja, pero Kamila estaba de viaje de trabajo, lejos, inaccesible, con aquellos antropólogos en lo más remoto de la selva. Solo le quedaba intentar calmar la ansiedad mientras la voz se repetía en su cabeza, cada vez más insistente.&lt;/p&gt;
&lt;p&gt;¿Ejercicios debería de hacer? ¿tal vez ver una película? —se preguntaba ella—, esa noche, decidió salir a caminar. El aire fresco quizás la ayudaría a pensar.&lt;/p&gt;
&lt;p&gt;En el parque cercano a su casa, un vecino hacía ejercicio en las barras. Lo observó desde lejos, tratando de no acercarse. Pero entonces, el hombre resbaló. Cayó de cara y se cortó la palma de la mano contra el metal oxidado.&lt;/p&gt;
&lt;p&gt;La sangre brotaba. Elena la vio gotear sobre el suelo y algo en ella se quebró. La ansiedad y el hambre se fusionaron en un impulso que no pudo controlar. Su cuerpo se movió solo, acercándose.&lt;/p&gt;
&lt;p&gt;—¿Es... estás bien...? —preguntó, con la voz más suave de lo que esperaba—. Ven, mi casa queda muy cerca. Puedo ayudarte con eso.&lt;/p&gt;
&lt;p&gt;—No es necesario, señorita, estoy bien —respondió el hombre cortésmente—.&lt;/p&gt;
&lt;p&gt;—No hay nada que temer, ven, te curaré esas heridas y tal vez —sutilmente se suelta un par de botones de su blusa—.&lt;/p&gt;
&lt;p&gt;El hombre no pudo contenerse con la insistencia y esa insinuación fue mucho para él.&lt;/p&gt;
&lt;p&gt;Mientras hablaba, sus ojos no se apartaban de la herida. Y él, confundido y dolorido, no notó la mirada hambrienta que se ocultaba detrás de su preocupación.&lt;/p&gt;
&lt;p&gt;Ya en su casa, lo guió hasta la cocina.&lt;/p&gt;
&lt;p&gt;—Puedes lavarte la herida en el fregadero —dijo, señalándolo—.&lt;/p&gt;
&lt;p&gt;El hombre obedeció, sin sospechar nada. Mientras inclinaba la mano bajo el agua, Elena ya tenía el cuchillo en la espalda. Lo pensó por un instante —un último destello de humanidad—, pero la voz rugió en su cabeza, más fuerte que nunca. Certeramente, lo clavó en su cuello. Una vez. Otra vez. Y otra más. El hombre cayó al suelo, agonizando.&lt;/p&gt;
&lt;p&gt;Ella se aproximó. Se arrodilló sobre él, inclinándose sobre su cuerpo moribundo. El calor de la sangre la rodeó como un abrazo en sus manos. Lamió sus manos y el cuchillo con esa excitación, y una pregunta cruzó su mente: ¿su sed comenzaría a saciarse? No. Pero el sabor la calmaba. La voz, por primera vez, se silenció.&lt;/p&gt;
&lt;p&gt;Y en ese silencio, algo nuevo nació: no era solo la sangre. Era algo más antiguo, más profundo. Un hambre que no conocía límites. Su rostro irradiaba una lujuria oscura, una excitación que nunca antes había sentido.&lt;/p&gt;
&lt;p&gt;Sin pensarlo, comenzó a morder directamente del cuello. Arrancaba pedazos de carne y los devoraba, cada vez más rápido, cada vez más hambrienta. El sabor la enloquecía. ¿Su hambre comenzaría a saciarse? No. Pero el sabor la calmaba. Por primera vez en semanas, ella se sentía bien.&lt;/p&gt;
&lt;p&gt;Y mientras masticaba, la voz volvió a susurrar, pero esta vez con un tono diferente. Satisfecho. Hambriento de más.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Bien... ésto... está... ¡delicioso!... ¡más!... ¡QUIERO MÁS!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;Y entonces, una pregunta cruzó su mente como un relámpago: ¿a qué sabrán los niños?, su carne se ve tan tierna, tan jugosa y... –una sonrisa distorsionó sus labios ensangrentados– Kamila. Kamila. Kamila. ¿A qué sabrá...?&lt;/em&gt;&lt;/p&gt;
</content:encoded><enclosure url="https://raksodiano.github.io/un-dev-mas/_astro/writings-post-2026-03-28.B79rcCcl_19KBxa.webp" length="0" type="image/jpeg"/></item></channel></rss>