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.
El usuario puede hacer un mal uso del archivo grub.conf y hacer que falle el sistema operativo Lin
Varios archivos de inicio Agregar varios archivos de inicio diciendo que la compilación será incor
Con la ventaja de una fuerte estabilidad, el DVR integrado es cada vez más aceptado por la industria
Demasiados archivos abiertos Los errores son fallas comunes en los sistemas Linux. Las soluciones se
Openssl de programación de aplicaciones
Cómo eliminar datos en modo mediante Redis
Sustitución del módulo de texto de reemplazo de Nginx
Análisis del proceso de arranque de Linux
Cómo configurar rm -rf recycler
Linux shell diferente conversión de datos binarios (binario, octal, hexadecimal, base64)
Aprendizaje completo del script de shell de Linux
Guía de uso de la ruta de cambio de Linux
Posibles problemas con el proceso de instalación de nagios
Tienda de aplicaciones Win 8 no puede conectar varias soluciones
Mantenimiento automatizado de Win XP con archivos .inf
Nuevo en Windows 8.1: los resultados de búsqueda pueden integrar datos de red
Aparece el boceto del diseño conceptual de Windows 8
Tienda de aplicaciones del sistema Win8 no puede abrir la solución
Unidad de disco compartido Windows 7 /XP /Vista LAN
Cómo instalar el controlador de gráficos Nvidia Quadro en el sistema Ubuntu
¿Cómo resolver el problema del Core 2 en la actualización de Win7 en la pantalla azul?
El análisis de WindowsAzure y la naturaleza multifacética de la nube