Este es uno de los capítulos del tutorial Scripts en Bash. Encontrarás los enlaces a todos los de capítulos, al final de este artículo.
También tienes opciones para depurar en Bash tus scripts. Opciones para depurar en Bash tus scripts, que te permitirán localizar y corregir errores en el caso de que aparezcan. Y es que esto de los errores es algo inevitable. Con independencia de tu experiencia en el desarrollo de scripts en Bash o en cualquier otro lenguaje de programación, tarde o temprano se te cuela un error en tu script.
Ten en cuenta que eso de tener un error o bug en un script no solo va a depender de ti. Es posible que el error lo cometas por un despiste, pero también es posible que te apoyes en otra herramienta, y que esa herramienta en la que te apoyes cambie su funcionamiento.
Ahora bien, el problema no es que tu script tenga un error. El problema es que no lo encuentres o que inviertas mucho tiempo en localizarlo, ese es el problema. Porque si lo encuentras rápidamente, no es tan preocupante, como si inviertes mas tiempo en localizar el error que en resolverlo.
Por esta razón es verdaderamente interesante conocer que opciones pone a tu disposición Bash para depurar tus scripts. Esto es precisamente lo que vamos a ver en este nuevo capítulo del tutorial sobre scripts en Bash.
Depurar en Bash
Como te indicaba en la introducción es posible depurar en Bash. Para ello, Bash te proporciona una serie de opciones que te ayudarán a depurar tus scripts.
Para utilizar estas opciones que te ofrece Bash para depurar tus scripts, es necesario que modifiques la primera línea de tu script, incluyendo una o mas de las opciones que Bash te ofrece.
La opción de depuración -x
La primera de las opciones que te ofrece Bash para depurar tus scripts es -x
. Esta opción la puedes incluir en la cabecera de tu script de la siguiente forma,
!#/bin/bash -x
También puedes ejecutar los scripts incluyendo la opción -x
de la siguiente forma,
bash -x tu_script.sh
O también puedes utilizar la combinación set -x
y set +x
. De esta forma cuando utilices la primera instrucción comenzará la depuración y cuando utilices la segunda se detendrá.
Pero ¿que hace la opción -x
? La opción -x
lo que hace, básicamente, es imprimir cada una de las instrucciones que se ejecutan en el script. De esta manera, puedes seguir de forma sencilla la ejecución de tu script.
Te lo demuestro con un ejemplo que siempre es mucho mas sencillo de entender. A este ejemplo le he llamado ejemplo.sh
, y le he dado permisos de ejecución, chmod +x ejemplo.sh
.
#!/bin/bash -x
echo "Esto es un ejemplo donde operamos 2+2=$((2+2))"
Fíjate que en la primera línea he incluido la opción -x
. Si ahora ejecutas el script con ./ejemplo.sh
, verás lo siguiente,
+ echo 'Esto es un ejemplo donde operamos 2+2=4'
Esto es un ejemplo donde operamos 2+2=4
Si ejecutas bash ejemplo.sh
, como te puedes imaginar, no se realiza la depuración. Si lo quieres hacer así tienes que incluir directamente la opción -x
, como te he indicado anteriormente, es decir, bash -x ejemplo.sh
.
Si te fijas, antes de ejecutarse la primera línea de tu script la imprime. De esta manera sabes exactamente lo que has ejecutado. Para distinguirlo incluye un +
al comienzo de la línea.
He modificado ligeramente el ejemplo anterior para que veas el uso de set -x
y set +x
. Fíjate,
#!/bin/bash
set -x
operacion=$((2+2))
set +x
echo "Esto es un ejemplo donde operamos 2+2=$operacion"
Si ahora ejecutas el script con ./ejemplo.sh
encontrarás el siguiente resultado,
+ operacion=4
+ set +x
Esto es un ejemplo donde operamos 2+2=4
¿Te has dado cuenta? Desde el momento que has establecido set -x
se imprimen todas las instrucciones hasta set +x
inclusive.
La opción de depuración -e
La siguiente de las opciones que tienes para depurar en Bash es -e
. Esta opción lo que hace es que cuando en tu script alguna instrucción de como resultado un valor distinto de cero detendrá el script, es decir, directamente se saldrá del script sin continuar.
Se trata de una forma bastante sencilla de localizar donde se puede encontrar el error en tu script. De nuevo recurro a un ejemplo para demostrarte su utilidad. Primero, lo haré sin la opción -e
.
#!/bin/bash -x
file=/no/existe
ls $file
echo $file
Si ejecutas este script como bash -x otro_ejemplo.sh
, el resultado es el siguiente,
+ file=/no/existe
+ ls /no/existe
ls: no se puede acceder a '/no/existe': No existe el archivo o el directorio
+ echo /no/existe
/no/existe
Sin embargo, si ejecutas el script con bash -xe otro_ejemplo.sh
el resultado es significativamente distinto,
+ file=/no/existe
+ ls /no/existe
ls: no se puede acceder a '/no/existe': No existe el archivo o el directorio
Como ves al ejecutar ls $file
y no existir el archivo por el que preguntas, directamente termina la ejecución del script. Ya has localizado el error.
Indicarte que puedes utilizar bash -x -e
o bash -xe
o bash -ex
es completamente indistinto y el funcionamiento resultará ser exactamente igual.
La opción de depuración -v
Así como la opción para depurar en Bash -x
expande los valores, la opción de depuración -v
imprime cada línea conforme la lee en el script, sin expandirla. Así, si ejecutas el último de los ejemplos que has visto bash -xv otro_ejemplo.sh
, el resultado será el siguiente,
#!/bin/bash -x
file=/no/existe
+ file=/no/existe
ls $file
+ ls /no/existe
ls: no se puede acceder a '/no/existe': No existe el archivo o el directorio
echo $file
+ echo /no/existe
/no/existe
De esta forma tu ves como escribiste cada una de las líneas en tu script y exactamente como es interpretada.
Conclusión sobre depurar en Bash
Ya has visto algunas de las opciones que tienes para depurar en Bash. Ahora está en disposición de no dejar pasar ni el mas mínimo de los errores. Tienes tres interesantes opciones para utilizarlas según tu interés y conveniencia.
Más información,