Cómo rastrear la ejecución de los comandos en el script de shell con el rastreo de shell

Cómo rastrear la ejecución de los comandos en el script de shell con el rastreo de shell

En este artículo de la serie de depuración de script de shell, explicaremos el modo de depuración del tercer shell script, es decir, el rastreo de shell y ver algunos ejemplos para demostrar cómo funciona y cómo se puede usar.

La parte anterior de esta serie claramente arroja luz sobre los otros dos modos de depuración de script de shell: modo detallado y Verificación de sintaxis Modo con ejemplos fáciles de entender de cómo habilitar la depuración de script de shell en estos modos.

  1. Cómo habilitar el modo de depuración de script de shell en Linux - Parte 1
  2. Cómo realizar el modo de depuración de verificación de sintaxis en scripts de shell - parte 2

El rastreo de shell simplemente significa rastrear la ejecución de los comandos en un script de shell. Para encender el rastreo de carcasa, use el -X opción de depuración.

Esto dirige al shell para mostrar todos los comandos y sus argumentos en la terminal a medida que se ejecutan.

Usaremos el sys_info.mierda shell script a continuación, que imprime brevemente la fecha y la hora de su sistema, el número de usuarios inició sesión y el tiempo de actividad del sistema. Sin embargo, contiene errores de sintaxis que necesitamos encontrar y corregir.

#!/bin/bash #script para imprimir breve información del sistema root_id = "0" date = "date" no_users = "quién | wc -l" tiempo de actividad = "tiempo de actividad" check_root () if ["$ uid" -ne "$ root_id "]; Entonces Echo "No se le permite ejecutar este programa!"Salir 1; print_sys_info () echo" Tiempo del sistema: $ date "echo" número de usuarios: $ no_users "echo" tiempo de actividad del sistema: $ instime check_root print_sys_info salida 0 

Guardar el archivo y hacer que el script sea ejecutable. El script solo se puede ejecutar por raíz, por lo tanto, emplea el comando sudo para ejecutarlo como se muestra a continuación:

$ chmod +x sys_info.sh $ sudo bash -x sys_info.mierda 
Rastreo de shell - Mostrar error en el script

De la salida anterior, podemos observar que, primero se ejecuta un comando antes de que su salida se sustituya como el valor de una variable.

Por ejemplo, el fecha se ejecutó por primera vez y su salida se sustituyó como el valor de la variable FECHA.

Podemos realizar la verificación de sintaxis solo para mostrar los errores de sintaxis de la siguiente manera:

$ sudo bash -n sys_info.mierda 
Verificación de sintaxis en el script

Si miramos el guión de shell de manera crítica, nos daremos cuenta de que el Declaración if le falta un cierre FI palabra. Por lo tanto, agregemos y el nuevo script ahora debería verse a continuación:

#!/bin/bash #script para imprimir breve información del sistema root_id = "0" date = "date" no_users = "quién | wc -l" tiempo de actividad = "tiempo de actividad" check_root () if ["$ uid" -ne "$ root_id "]; Entonces Echo "No se le permite ejecutar este programa!"EXIT 1; fi print_sys_info () echo" Tiempo del sistema: $ date "echo" número de usuarios: $ no_users "echo" tiempo de actividad del sistema: $ instime check_root print_sys_info salida 0 

Guarde el archivo nuevamente y invoquelo como root y haga una verificación de sintaxis:

$ sudo bash -n sys_info.mierda 
Realizar la verificación de sintaxis en scripts de shell

El resultado de nuestra operación de verificación de sintaxis anterior todavía muestra que hay un error más en nuestro script en línea 21. Entonces, todavía tenemos una corrección de sintaxis que hacer.

Si observamos el script analíticamente una vez más, el error en línea 21 se debe a una cita doble de cierre faltante (") en el último comando de eco dentro del print_sys_info función.

Agregaremos la cita doble de cierre en el eco comando y guardar el archivo. El script cambiado está a continuación:

#!/bin/bash #script para imprimir breve información del sistema root_id = "0" date = "date" no_users = "quién | wc -l" tiempo de actividad = "tiempo de actividad" check_root () if ["$ uid" -ne "$ root_id "]; Entonces Echo "No se le permite ejecutar este programa!"Salir 1; fi print_sys_info () echo" Tiempo del sistema: $ date "echo" número de usuarios: $ no_users "echo" tiempo de actividad del sistema: $ instime " check_root print_sys_info salida 0 

Ahora verifique sintácticamente el script una vez más.

$ sudo bash -n sys_info.mierda 

El comando anterior no producirá ninguna salida porque nuestro script ahora es sintácticamente correcto. También podemos rastrear la ejecución del script por segunda vez y debería funcionar bien:

$ sudo bash -x sys_info.mierda 
Ejecución de script de shell traza

Ahora ejecuta el guión.

$ sudo ./sys_info.mierda 
Shell script para mostrar fecha, hora y tiempo de actividad

Importancia del rastreo de ejecución de script de shell

El rastreo de script de shell nos ayuda a identificar errores de sintaxis y, lo que es más importante, errores lógicos. Tomar por ejemplo el check_root función en el sys_info.mierda shell script, que está destinado a determinar si un usuario es root o no, ya que el script solo puede ser ejecutado por el superusor.

check_root () if ["$ uid" -ne "$ root_id"]; Entonces Echo "No se le permite ejecutar este programa!"Salir 1; fi 

La magia aquí está controlada por el Declaración if expresión ["$ Uid" -ne "$ root_id"], Una vez que no usamos el operador numérico adecuado (-nordeste En este caso, que significa no igual), terminamos con un posible error lógico.

Suponiendo que usamos -ecualización (significa igual a), esto permitiría que cualquier usuario del sistema, así como el usuario raíz, ejecute el script, de ahí un error lógico.

check_root () if ["$ uid" -eq "$ root_id"]; Entonces Echo "No se le permite ejecutar este programa!"Salir 1; fi 

Nota: Como miramos antes al comienzo de esta serie, el comando set de shell incorporado puede activar la depuración en una sección particular de un script de shell.

Por lo tanto, la siguiente línea nos ayudará a encontrar este error lógico en la función rastreando su ejecución:

El script con un error lógico:

#!/bin/bash #script para imprimir breve información del sistema root_id = "0" date = "date" no_users = "quién | wc -l" tiempo de tiempo de tiempo = "tiempo de actividad" check_root () if ["$ uid" -eq "$ root_id "]; Entonces Echo "No se le permite ejecutar este programa!"EXIT 1; fi print_sys_info () echo" Tiempo del sistema: $ date "echo" número de usuarios: $ no_users "echo" sistema de actividad del sistema: $ instime " #curning en la depuración de la función check_root set -x; check_root ; set +x; print_sys_info salida 0 

Guardar el archivo e invocar el script, podemos ver que un usuario del sistema regular puede ejecutar el script sin sudo Como en la salida a continuación. Esto se debe a que el valor de User_id es 100 que no es igual a la raíz Root_id cual es 0.

ps ./sys_info.mierda 
Ejecute shell script sin sudo

Bueno, es todo por ahora, hemos llegado al final de la serie de depuración de script de Shell, el formulario de respuesta a continuación se puede usar para abordar cualquier pregunta o retroalimentación, con respecto a esta guía o toda la serie de 3 partes.