Debugueando en BASH
Cuando nos encontramos trabajando con scripts realizados en BASH, existen
muchas ocasiones en las que nos atascamos con un bug que no somos capaces de entrontrar.
En ese momento nos quedan 2 opciones, una llenar el código con algunas sentencias echo para
intentar acotar donde sucede el error, u otra opción que consiste en activar el modo debug de BASH.
La primera opción consiste en añadir diferentes sentencias en nuestro código:
... echo "Mensaje 1, hasta aquí llega." ... echo "Mensaje 2, hasta aquí llega." ...
Normalmente esta técnica nos puede ayudar a acotar el error, para posteriormente ejecutar las líneas
que pueden estar fallando por separado para tratar de arreglarlo.
La otra opción es bastante interesante y no todo el mundo la conoce. Consiste en activar el modo
DEBUG de BASH, para conocer que sentencias se están ejecutando. Se activa con el flag -x:
/bin/bash -x programa.sh
Imaginemos que tenemos el siguiente programa que crea el directorio “directorio“, si es que
no existe:
#!/bin/bash echo "Bienvenido a este programa" if [ -d "directorio" ] then echo "Ya existe" else mkdir "directorio" fi
Si ejecutamos el programa en modo DEBUG, saldrá lo siguiente:
bash -x programa.sh + echo 'Bienvenido a este programa' Bienvenido a este programa + '[' -d directorio ']' + mkdir directorio
Existen varias formas de redirigir la salida del DEBUG:
Redirigir la salida del programa BASH
bash -x script_to_debug 2>log.txt
Redirigir ambas salidas (output del bash, del script, y de los errores)
bash -x script_to_debug >log.txt 2>&1
Guardar la sesión entera gracias al comando ‘script’
$ script log.txt Script started, file is log.txt $ bash -x script_to_debug + .... .... $ ^D $ Script done, file is log.txt