BASH: Dos trucos para chequear sintaxis de un script usando set y las variables noexec y xtrace

El comando set nos permite establecer o visualizar el contenido de las variables de shell.

si tecleamos ‘set -o’ veremos la lista de dichas variables y su valor:


[root@xxxx]# set -o
allexport       off
braceexpand     on
emacs           on
errexit         off
errtrace        off
functrace       off
hashall         on
histexpand      on
history         on
ignoreeof       off
interactive-comments    on
keyword         off
monitor         on
noclobber       off
noexec          off
noglob          off
nolog           off
notify          off
nounset         off
onecmd          off
physical        off
pipefail        off
posix           off
privileged      off
verbose         off
vi              off
xtrace          off

Hay dos variables qeu nos van a ayudar a hacer un buen debug de nuestros shell scripts: noexec y xtrace.

Si activamos la variable noexec, podremos ejecutar un script sin que se ejecute ningún comando que contenga, aunque sí seguirá las estructuras de control (if, while, for.. ). Este comando no funciona en modo interactivo, es decir, solo lo podemos ejecutar dentro de un script:

Aqui tenemos un ejemplo. Todo lo que esté por debajo de ‘set -n’ no lo va a ejecutar, aunque sí que sigue el flujo hasta el final del script. Sólamente nos ayuda a chequear la sintaxis. Si hubiera un error en el if, lo veríamos por pantalla.


echo "Entramos en el script"
set -n
fichero="/tmp/fich.txt"
if [ -f $fichero ]
then
        echo "El fichero existe, mostramos su contenido";
        cat $fichero;
else
        echo "El fichero no existe, lo creamos";
        date > $fichero;
fi

al ejecutarlo vemos esto:


[root@xxx]# sh pruebaset.sh
Entramos en el script

Si cometieramos el error de, en lugar de escribir ‘if’, escribir ‘i’:


i [ -f $fichero ]

Veriamos esto:


[root@xxxx ]# sh pruebaset.sh
Entramos en el script
pruebaset.sh: line 5: syntax error near unexpected token `then'
pruebaset.sh: line 5: `then'

La otra variable molona es xtrace. Si activamos dicha variable, por cada comando o estructura de control, veremos una traza de lo que hace. Nos ayudará a debuguear el script en caso de errores con variables, etc.

ej:


set -x
echo "Entramos en el script"
fichero="/tmp/fich.txt"
if [ -f $fichero ]
then
        echo "El fichero existe, mostramos su contenido";
        cat $fichero;
else
        echo "El fichero no existe, lo creamos";
        date > $fichero;
fi

En una primera ejecución veríamos esto:


[root@xxx]# sh pruebaset.sh
+ echo 'Entramos en el script'
Entramos en el script
+ fichero=/tmp/fich.txt
+ '[' -f /tmp/fich.txt ']'
+ echo 'El fichero no existe, lo creamos'
El fichero no existe, lo creamos
+ date

Y en una segunda:


[root@xxx]# sh pruebaset.sh
+ echo 'Entramos en el script'
Entramos en el script
+ fichero=/tmp/fich.txt
+ '[' -f /tmp/fich.txt ']'
+ echo 'El fichero existe, mostramos su contenido'
El fichero existe, mostramos su contenido
+ cat /tmp/fich.txt
Fri Sep 30 11:02:06 CEST 2011

Una de las cosas bonicas de xtrace es que también se puede activar en modo interactivo para debuguear errores en comandos.

Un saludo.

MiJacK.

Los comentarios están cerrados.