¿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
Ahora ejecuta el script con el comando:
sh ./Hola.Geek
Deberías ver exactamente la salida que esperas:
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.
Ahora ejecuta el comando sh ./Hola.Geek
. Esta vez, la salida es bastante diferente:
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
- ANTES DE CONTINUAR, ESTO ES PARA TI: Cómo revisar los registros (logs) del sistema en Linux
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
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! :’)