miércoles, 3 de mayo de 2017

Trazado

Los errores a menudo son casos de un flujo lógico inesperado dentro de un script. Es decir, partes del script que nunca se ejecutan, o se ejecutan en el orden incorrecto o en el momento equivocado. Para ver el flujo real del programa, usamos una técnica llamada tracing o trazado.

Un método de trazado implica colocar mensajes informativos en un script que muestren la ubicación de la ejecución. Podemos añadir mensajes a nuestro fragmento de código:

echo "preparing to delete files" >&2
if [[ -d $dir_name ]]; then
    if cd $dir_name; then
echo "deleting files" >&2
        rm *
    else
        echo "cannot cd to '$dir_name'" >&2
        exit 1
    fi
else
    echo "no such directory: '$dir_name'" >&2
    exit 1
fi
echo "file deletion complete" >&2

Enviamos mensajes al error estándar para separalo de la salida normal. No sangramos las líneas que contienen los mensajes, así es más fácil encontrarlas cuando sea el momento de borrarlas.

Ahora, cuando se ejecuta el script, es posible ver que el borrado de archivos se ha realizado:

[me@linuxbox ~]$ deletion-script
preparing to delete files
deleting files
file deletion complete
[me@linuxbox ~]$

bash también proporciona un método de trazado, implementado por la opción -x y el comando set con la opción -x. Usando nuestro anterior script trouble, podemos activar el trazado para todo el script añadiendo la opción -x en la primera línea:

#!/bin/bash -x

# trouble: script to demonstrate common errors

number=1

if [ $number = 1 ]; then
    echo "Number is equal to 1."
else
    echo "Number is not equal to 1."
fi

Cuando se ejecuta, el resultado es el siguiente:

[me@linuxbox ~]$ trouble
+ number=1
+ '[' 1 = 1 ']'
+ echo 'Number is equal to 1.'
Number is equal to 1.

Cuando el trazado está activado, vemos que los comandos se ejecutan con expansiones aplicadas. El signo más al principio de la línea indica el resultado del trazado para distinguirlo de las líneas de salida normal. El signo más es el carácter por defecto de la salida del trazado. Está contenido en la variable de shell PS4 (prompt string 4 - cadena de prompt 4). El contenido de esta variable puede ajustarse para hacer el prompt más útil. Aquí, modificamos el contenido de la variable para incluir el número de línea actual en el script donde se realiza el trazado. Fíjate que se requieren comillas simples para impedir la expansión hasta que el prompt se haya usado realmente:

[me@linuxbox ~]$ export PS4='$LINENO + '
[me@linuxbox ~]$ trouble
5 + number=1
7 + '[' 1 = 1 ']'
8 + echo 'Number is equal to 1.'
Number is equal to 1.

Para realizar un trazado en una porción concreta de un script, en lugar del script completo, podemos usar el comando set con la opción -x:

#!/bin/bash

# trouble: script to demonstrate common errors

number=1

set -x # Turn on tracing
if [ $number = 1 ]; then
    echo "Number is equal to 1."
else
    echo "Number is not equal to 1."
fi
set +x # Turn off tracing

Usamos el comando set con la opción -x para activar el trazado y la opción +x para desactivar el trazado. Esta técnica puede usarse para examinar múltiples porciones de un script problemático.

No hay comentarios:

Publicar un comentario