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.

Instalación

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:

Archlinux

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í.

Ubuntu

sudo apt-get install texinfo autoconf automake build-essential libtool git

Compilar Bashdb

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

Pre configuración

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

Uso

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

Configurarlo adentro de VSCODE

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:

¿Y cuando estoy remoto?

  • 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]

⚠️ **GitHub.com Fallback** ⚠️