Cómo depurar scripts bash en Linux
Cómo depurar scripts bash en Linux

Cómo depurar scripts bash en Linux

¿Tus scripts Bash tienen un problema? Descubre cómo iniciar el proceso de depuración de esos scripts, con la ayuda de herramientas que funcionan a la perfección con tu código.

Para muchos administradores de Linux, los scripts de bash son un uso obligatorio. Estos prácticos scripts ayudan a hacer de Linux uno de los sistemas operativos más flexibles del planeta. Hay muy poco que no puedas hacer con un script bien escrito. Pero, ¿qué sucede cuando has construido cuidadosamente ese script, solo para encontrar que no se ejecuta según lo planeado? Algo esta mal. Si el script es largo y complejo, es posible que tengas un tiempo para rastrear los problemas.

Afortunadamente, hay muchas herramientas disponibles para ayudarte a depurar tus scripts de bash. Una de estas herramientas es x. Esta herramienta de depuración particular te permite marcar un script donde deseas enfocar tus esfuerzos de depuración. Con set x puedes depurar un script completo, una sección de un script o una sola línea.

Una segunda herramienta útil te permite registrar la salida de un script en un archivo. Esto es bastante útil, especialmente cuando el script es más largo de lo normal (o si deseas debutar la salida más adelante).

Veamos cómo se usan estas dos herramientas en un simple script de bash.


1. Requisitos (script Bash de ejemplo)

Lo único que necesitas para esto es una distribución de Linux. La mayoría de cada distribución contendrá las herramientas necesarias, sin embargo, la distribución debe incluir la versión 5.0 de bash o superior. Puedes averiguar qué versión de bash incluye tu distribución con el comando bash --version. Debido a que estamos trabajando con la línea de comandos, no importa si usas una distribución de escritorio o de servidor.

El script básico que usaré para esta prueba es:

#!/bin/bash

var="Hola Geek"

# Imprímelo
echo "$var"

# Otra forma de mostrarlo
printf "%s\n" "$var"

echo "Tu home es: $HOME"

Eso es un script bastante sencillo. Crea un nuevo archivo con el comando nano Hola.Geek con los contenidos anteriores. Guarda y cierra el archivo. Da los permisos ejecutables del nuevo archivo con el comando:

chmod u+x Hola.Geek
script Bash de ejemplo
script Bash de ejemplo

Ahora ejecuta el script con el comando:

sh ./Hola.Geek

Deberías ver exactamente la salida que esperas:

Ejecutar script bash en Linux
Ejecutar script bash en Linux

Por supuesto, no hay nada de malo en este script, pero es un excelente ejemplo.

2. Depurar script de Bash con x (xtrace)

Ahora vamos a modificar el script, para incluir nuestras herramientas de depuración. La primera es la entrada de registro. Bajo #!/bin/bash, agrega lo siguiente:

exec 5> salida_debug.txt
BASH_XTRACEFD="5"
PS4='$LINENO: '

La primera línea nombra el archivo de depuración, salida_debug.txt. La segunda línea le dice a bash dónde escribir tu información xtrace (que se declarará con set x). Finalmente, la tercera línea imprimirá los números de línea, para facilitar aún más la depuración.

A continuación, debemos usar set x para indicar qué código queremos depurar. Digamos que la sección echo $HOME del script funciona como se esperaba, mientras que la sección echo $var no lo es. Encerramos esta sección con set x para que solo podamos depurar esa parte del script. Declaramos que el inicio de la sección se depura con set -x y el final con set + x. Así que la nueva sección de código se verá así:

# activar la depuración
set -x

var="Hola Geek"

# Imprímelo
echo "$var"

# Otra forma de mostrarlo
printf "%s\n" "$var"

# desactivar la depuración
set +x

# seguir ejecutando comandos ...

Guarda y cierra ese archivo.

Depurar script Bash con xtrace
Depurar script Bash con xtrace

Ahora ejecuta el comando sh ./Hola.Geek. Esta vez, la salida es bastante diferente:

Depurar bash en terminal
Depurar bash en terminal

Como puedes ver, cada línea de comando comienza con un carácter [:] y la salida generada por las líneas de código sigue inmediatamente y no incluye el carácter [:]. Esto hace que sea mucho más fácil depurar lo que está sucediendo.


Si no encuentras ningún error en el código que marcaste con set -x y set + x, mueve esas líneas a otra sección y ejecuta el comando nuevamente.

3. Depuración a través del archivo de registro

Si estás tratando con un script de bash que es demasiado largo para una salida estándar, querrás echar un vistazo al archivo de registro de depuración que he declarado. Sin embargo, encontrarás ese archivo vacío. ¿Por qué? Porque hemos ejecutado el script con la ayuda del shell sh, y el shell sh no es compatible con el comando BASH_XTRACEFD. En lugar de ejecutar el script con sh ./Hola.Geek, simplemente ejecuta el comando ./Hola.Geek. Esto usará bash, en lugar de sh, y entonces la salida de depuración se puede ver con el comando:

less salida_debug.txt
Depurar script bash con archivo de registro
Depurar script bash con archivo de registro

Debido a que he escrito el script de esa manera, puedo:

  • Ejecutar el script con sh ./Hola.Geek para que la información de depuración sea enviada a la salida estándar (lo que significa que se imprime en la ventana del terminal después de ejecutar el comando).
  • Ejecutar el script con ./Hola.Geek para que la información de depuración se escriba en el archivo salida_debug.text.

También puedes notar que, si ejecutas el script con el comando ./Hola.Geek, la información de depuración no se envía a la salida estándar, y se verá exactamente como en la última imagen.

4. Conclusión

Y esta es una forma muy sencilla de comenzar el proceso de depuración de tus scripts de bash. Para muchos, esto parecerán pasos pequeños, pero una vez que aprendas a usar estas herramientas, encontrarás un medio invaluable para depurar esos scripts. ¡Compártelo! :’)

Mi Carro Close (×)

Tu carrito está vacío
Ver tienda