Depuración de Shell

  
 

Este artículo presenta de manera exhaustiva y sistemática técnicas de depuración de scripts de shell, incluida la salida de información clave mediante echo, tee, trap, etc., el seguimiento del valor de las variables, la incorporación de enlaces de depuración en scripts y el uso de la opción " -n " para scripts de shell En la revisión gramatical, use la opción "-x" para lograr el seguimiento del script de shell una por una, el uso inteligente de las variables integradas del shell para mejorar la información de salida de la opción "-x". I. Prefacio

La programación de shell se usa ampliamente en el mundo de Unix /Linux. Dominar la programación de shell también es una necesidad para un excelente desarrollador de Unix /Linux y administrador de sistemas. La tarea principal de la depuración de secuencias de comandos es averiguar la causa del error de la secuencia de comandos y ubicar la línea en la que se produjo el error en el código fuente de la secuencia de comandos. Los métodos más comunes incluyen el análisis de la información de error de salida y la adición de declaraciones de depuración a la secuencia de comandos. Usar herramientas de depuración, etc. Sin embargo, en comparación con otros lenguajes de alto nivel, el intérprete de shell carece del mecanismo de depuración y las herramientas de depuración correspondientes. La información de error de salida a menudo no es clara. Cuando el principiante está depurando el script, además de saber cómo generar algo de información con la declaración de eco, No hay otra manera, pero confiar en un gran número de declaraciones de eco para diagnosticar errores es realmente incomprensible, por lo que los principiantes comunes se quejan de que los scripts de shell son demasiado difíciles de depurar. Este artículo introducirá sistemáticamente algunas técnicas importantes de depuración del script de shell, con la esperanza de beneficiar a los principiantes de la shell.

El público objetivo de este artículo son los desarrolladores, evaluadores y administradores de sistemas en el entorno Unix /Linux, lo que requiere que el lector tenga conocimientos básicos de programación de shell. Los ejemplos utilizados en este artículo se probaron en Bash 3.1 + Redhat Enterprise Server 4.0, pero las técnicas de depuración deberían ser igualmente aplicables a otros shells.

Segundo. Salida de información de depuración en scripts de shell

Es el método de depuración más común para mostrar información relevante de algunos lugares clave o errores al agregar declaraciones de depuración en el programa. Los programadores de shell suelen usar sentencias echo (los programadores ksh suelen usar impresión) para generar información, pero confiar en la salida de la sentencia echo para rastrear la información es incómodo. El gran número de sentencias de eco agregadas al script durante la fase de depuración debe ser laborioso en el momento de la entrega del producto. Uno de eliminar. En respuesta a este problema, esta sección presenta principalmente algunos métodos para generar información de depuración de manera conveniente y eficiente.

1. Uso del comando trap El comando

trap se utiliza para capturar la señal especificada y ejecutar un comando predefinido. La sintaxis básica es: señal de "comando" de captura, donde la señal es la señal que se debe capturar y el comando que se ejecuta después de que se capture la señal especificada. Puede usar el comando kill – l para ver todos los nombres de señales disponibles en el sistema. Los comandos que se ejecutan después de capturar la señal pueden ser una o más declaraciones de shell legales o un nombre de función. Cuando se ejecuta el script de shell, generará tres llamadas "pseudo-señales", que se denominan "señales falsas" porque las tres señales son generadas por el shell, y las otras señales son causadas por < u> sistema operativo (generado por el sistema operativo), el uso del comando de captura para capturar estas tres "señales falsas" y la información relacionada con la salida es muy útil para la depuración.


Tabla 1. Cuando se genera el nombre de señal de pseudo-señal de shell SALIR Sale de una función o se ejecuta todo el script ERR Cuando un comando devuelve un estado distinto de cero (lo que representa la ejecución del comando no es exitoso) Antes de que se ejecute cada comando en el script DEBUG

Al capturar la señal EXIT, podemos generar el valor de alguna variable que queremos rastrear cuando el script de shell se interrumpe o sale de la función, y así juzga el script. El estado de ejecución y la causa del error son: trampa 'comando' SALIR o trampa 'comando' 0

Al capturar la señal ERR, podemos rastrear fácilmente el comando o función no exitoso y dar salida a la correspondiente La información de depuración, a continuación, es un programa de ejemplo que captura la señal ERR, donde $ LINENO es una variable incorporada en el shell que representa el número de línea actual del script del shell.

$ cat -n exp1.sh 1 ERRTRAP () 2 {3 echo " [LINE: $ 1] Error: El comando o la función salió con el estado $? " 4} 5 foo () 6 {7 return 1; 8} 9 captura 'ERRTRAP $ LINENO' ERR 10 abc 11 foo

La salida es la siguiente:

$ sh exp1.sh exp1.sh: línea 10: abc: comando no encontrado [LINE: 10] Error: comando o función salido con estado 127 [LINE: 11] Error: comando o función salido con estado 1

En el proceso de depuración, para rastrear el valor de ciertas variables, a menudo necesitamos Insertar la misma declaración de eco en muchos lugares en un script de shell para imprimir el valor de una variable relacionada es engorroso y torpe. Al capturar la señal DEBUG, solo necesitamos una declaración de captura para completar el seguimiento de las variables relevantes.

El siguiente es un programa de ejemplo para rastrear variables capturando señales DEBUG:

$ cat – n exp2.sh 1 #! /bin /bash 2 trap 'echo " antes de ejecutar la línea : $ LINENO, a = $ a, b = $ b, c = $ c " 'DEBUG 3 a = 1 4 si [" $ a " -eq 1] 5 luego 6 b = 2 7 else 8 b = 1 9 Fi 10 c = 3 11 echo " final "

La salida es la siguiente:

$ sh exp2.sh antes de ejecutar la línea: 3, a =, b =, c = antes de ejecutar la línea : 4, a = 1, b =, c = antes de ejecutar la línea: 6, a = 1, b =, c = antes de ejecutar la línea: 10, a = 1, b = 2, c = antes de ejecutar la línea: 11, a = 1, b = 2, c = 3 end

De los resultados en ejecución, está claro que el valor de la variable relevante cambia después de que se ejecuta cada comando. Al mismo tiempo, desde el número de línea impreso en el resultado en ejecución, puede ver la trayectoria de ejecución de todo el script, y puede determinar qué ramas condicionales se ejecutan y qué ramas condicionales no se ejecutan.

2. Utilizando el comando tee

En el script de shell, se utilizan mucho la canalización y la redirección de entrada y salida. Bajo la acción de la tubería, el resultado de la ejecución de algunos comandos se convierte directamente en el siguiente comando. Entrada Si descubrimos que los resultados de ejecución de un lote de comandos conectados por tuberías no son los esperados, debemos revisar los resultados de ejecución de cada comando para determinar dónde está el problema, pero debido al uso de tuberías, estos resultados intermedios no se muestran. En la pantalla, es difícil de depurar, y podemos usar el comando tee.

Copyright © Conocimiento de Windows All Rights Reserved