Uso e instalación del Bash Debugger - perfeccion-ar/infraestructura-clasica-y-avanzada GitHub Wiki
(2024) Pancutan - https://about.me/elbunker
Expuesto en conferencia Suckless scripting - Con Bash trabajamos y nos divertimos - Sábado 12 de octubre de 2024 para /var/mdz, Campus Barcala
Recomendado: vea primero este video de Fernando Leiva: Desde cero #13 - ¡Aprendemos a hacer scripts!
Programar en Bash es necesario para automatizar montones de tareas en servidores Linux. Pero tiene una sintaxis complicada en relación con los nuevos lenguajes. Un buen debugger como Bashdb puede ayudarnos en el proceso. Y conectado al plugin Bash Debug de VSCode, puede incluso ser una experiencia bastante divertida.

Para instalar puede usarlo desde Docker, o compilarlo desde las fuentes.
En el caso de Docker
Si solo quiere probar, y tiene Docker, puede hacer antes
docker run -it --rm --name ejemplo-bashdb ubuntu:24.04 bash
En mi caso, prefiero tenerlo disponible en las distribuciones que uso habitualmente:
Bashdb ya está en AUR, pero hasta la versión 5.0 procedente del viejo repo de bashdb.sourceforge.net
Si quiere tener la última versión:
pacman -S texinfo autoconf automake base-devel libtool git
yay pod2man
Si no tiene yay, instale desde aquí.
sudo apt-get install texinfo autoconf automake build-essential libtool git

Si ya cumplimos con todas las dependencias anteriores, podemos seguir con la compilación.
¿Por qué compilar?
- Porque no hay binarios precompilados. Bashdb se encuentra enlazado dinámicamente a la versión de Bash que usted tenga.
- Porque Bashdb no viene como paquete en Ubuntu. Y en versiones nuevas (ej: Ubuntu 24.04), no compila bien desde su fuente original y desmantenida, en https://bashdb.sourceforge.net
- En el caso de Archlinux, bashdb está en AUR. Pero tiene el mismo problema: su PKGBUILD apunta al viejo sourceforge, con soporte solo hasta Bash 5.0. Si usted tiene Arch, probablemente ya tenga Bash 5.2 o superior.
Entonces: ignorar fuentes de Sourceforge y, en cambio, clonar y compilar desde Github.
Atención a la rama: hay para todas las versiones de Bash. Haga bash --version
para saber su propia versión de Bash.
git clone https://github.com/rocky/bashdb/
cd bashdb
Ver todas las ramas
git branch -a
Ejemplo
$ bash --version
GNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu)
Entonces, en ese caso, tras clonar el repo, usted debería switchear de rama
$ git switch bash-5.0
Si usa Arch, preste atención a correr bash --version
y a switchearse a la última rama disponible. Al momento de la redacción de este documento, tanto Bash como Bashdb están en versión 5.2
¿Ya eligió su rama? ¡Pues a compilar!
./autogen.sh
make
sudo make install
Algunas variables para que Bashdb sea mas fácil de usar
echo "set autolist on" > ~/.bashdbinit
echo "set listsize 20" >> ~/.bashdbinit
echo "alias bashdb='bashdb -x ~/.bashdbinit'" >> ~/.bashrc
source ~/.bashrc
bashrc ./tonto_script_se_mas_divertido.bash
Control de flujo
n - next
s - step to next line
l - show local lines, press l again to scroll down
restart - reruns bashscript, it re-loads it prior to execution.
Mostrar variables
set -o posix; set - Mostrar TODAS las variables disponibles del sistema
Ejemplo: USER, PATH, HOSTNAME, JAVA_HOME, etc
env, printenv - Mostrar solo las variables de entorno del shell actual
p o print $VAR - Mostrar el contenido de algúna variables, ejemplo, $HOSTNAME
Breakpoints
b <line num> - Set breakpoint
c - Continuar hasta alcanzar breakpoint
info b - Listar todos los breakpoints
d <line #> - Borrar breakpoint de la linea #
Mas cosas
eval - evaluate some custom command, ex: eval echo hi
shell - launch a sub-shell in the middle of execution, this is handy for manipulating variables
Ejemplo debuggeando un script de limpieza, bajo Byobu


Para debuggear fácilmente desde Vscode, bashdb debe estar instalado. Lo mismo el paquete shellcheck (ej: sudo apt-get install shellcheck) para tener un lintern (inspección de código).

Luego, se debe generar un launch.json como dice la documentación del plugin "Bash Debug" en https://marketplace.visualstudio.com/items?itemName=rogalmic.bash-debug
Es decir, básicamente, generar un launch.json

Ese archivo se auto generará en .vscode/launch.json - su contenido debería ser parecido a esto:
{
// Use IntelliSense para saber los atributos posibles.
// Mantenga el puntero para ver las descripciones de los existentes atributos.
// Para más información, visite: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "bashdb",
"request": "launch",
"name": "Bash-Debug (type in script name)",
"cwd": "${workspaceFolder}",
"program": "${command:AskForScriptName}",
"args": []
},
{
"type": "bashdb",
"request": "launch",
"name": "Bash-Debug (select script from list of sh files)",
"cwd": "${workspaceFolder}",
"program": "${command:SelectScriptName}",
"args": []
},
{
"type": "bashdb",
"request": "launch",
"name": "Bash-Debug (hardcoded script name)",
"cwd": "${workspaceFolder}",
"program": "${workspaceFolder}/path/to/script.sh",
"args": []
},
{
"type": "bashdb",
"request": "launch",
"name": "Bash-Debug (simplest configuration)",
"program": "${file}"
},
{ //ejemplo debugging pasando ruta al script y parámetros
"type": "bashdb",
"name": "fullname.bash con parametros",
"request": "launch",
"program": "/home/s/Insync/[email protected]/Google Drive/Mochila/Trucos/Shell/fullname-cuit-leiva/fullname.bash",
"args": [
"23180414",
],
"cwd": "/home/s/Insync/[email protected]/Google Drive/Mochila/Trucos/Shell/fullname-cuit-leiva/",
"env": {},
}
]
}
Aproveche especialmente la última de las configuraciones aquí presentes: aquella en la que se le puede pasar parámetros:

- VSCODE funciona muy bien desplegado remoto mediante el plugin SSH
- Vim tiene muy buen soporte. Mejor aún lo tiene Neovim, y aún mucho más completo lo tiene LunarVim![tuxBOFH-grande-sin-logo]
Eso es todo: happy debugging!
Sergio Alonso - [email protected]