Table of Contents
Cómo rastrear la ejecución de comandos en el script de Shell con rastreo de Shell
En este artículo de la serie de depuración de scripts de shell, explicaremos el modo de depuración del tercer script de shell, que es el rastreo de shell, y veremos algunos ejemplos para demostrar cómo funciona y cómo se puede utilizar.
La parte anterior de esta serie arroja luz sobre los otros dos modos de depuración de scripts de shell: el modo detallado. y el modo comprobación de sintaxis. con ejemplos fáciles de entender de cómo habilitar la depuración de scripts de shell en estos modos.
- Cómo habilitar el modo de depuración de scripts de shell en Linux-Parte 1
- Cómo realizar la verificación de sintaxis en el modo de depuración 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 activar el rastreo de shell, use la opción de depuración-x.
Esto indica al shell que muestre todos los comandos y sus argumentos en el terminal a medida que se ejecutan.
Usaremos el El script de shell sys_info.sh a continuación, que imprime brevemente la fecha y hora de su sistema, el número de usuarios conectados y el tiempo de actividad del sistema. Sin embargo, contiene errores de sintaxis que debemos encontrar y corregir.
#!/Bin/bash #script para imprimir información breve del sistema ROOT_ID = “0” DATE = `date` NO_USERS =` who | wc-l` UPTIME = `uptime` check_root () if [” $ UID “-ne” $ ROOT_ID “]; luego repita “¡No está autorizado a ejecutar este programa!” salida 1; print_sys_info () echo “Hora del sistema: $ DATE” echo “Número de usuarios: $ NO_USERS” echo “Tiempo de actividad del sistema: $ UPTIME check_root print_sys_info exit 0 freestar.config.enabled_slots.push (LocationName:” tecmint_incontent “, slotId : “tecmint_incontent”);
Guarde el archivo y haga que el script sea ejecutable. El script solo puede ser ejecutado por root, por lo tanto, utilice el comando sudo para ejecutarlo de la siguiente manera:
$ chmod + x sys_info.sh $ sudo bash-x sys_info.sh
Rastreo de Shell-Mostrar error o en Script
De la salida anterior, podemos observar que, un comando se ejecuta primero antes de que su salida se sustituya como el valor de una variable.
Por ejemplo, la fecha. se ejecutó por primera vez y su salida se sustituyó por el valor de la variable FECHA.
Podemos realizar una verificación de sintaxis para mostrar solo los errores de sintaxis de la siguiente manera:
$ sudo bash-n sys_info.sh
Comprobación de sintaxis en script
Si miramos el shell el guión de forma crítica, nos daremos cuenta de que el si a la declaración le falta una palabra final. Por lo tanto, vamos a agregarlo y la nueva secuencia de comandos debería verse a continuación:
#!/Bin/bash #script para imprimir una breve información del sistema ROOT_ID = “0” DATE = `date` NO_USERS =` who | wc-l` UPTIME = `uptime` check_root () if [” $ UID “-ne” $ ROOT_ID “]; luego repita “¡No está autorizado a ejecutar este programa!” salida 1; fi print_sys_info () echo “Hora del sistema: $ DATE” echo “Número de usuarios: $ NO_USERS” echo “Tiempo de actividad del sistema: $ UPTIME check_root print_sys_info exit 0
Guarde el archivo de nuevo e invoque como root y haga algo comprobación de sintaxis:
$ sudo bash-n sys_info.sh
Realizar comprobación de sintaxis en scripts de shell
El resultado de nuestra operación de comprobación de sintaxis anterior todavía muestra que hay un error más en nuestro script en la línea 21. Por lo tanto, todavía tenemos alguna corrección de sintaxis para hacer.
Si miramos analíticamente el script una vez más, el error en la línea 21. se debe a que faltan comillas dobles de cierre (”) en el último comando echo dentro de la función print_sys_info .
Agregaremos las comillas dobles de cierre en el comando echo. y guardaremos el archivo. El script modificado está a continuación:
#!/Bin/bash #script para imprimir información breve del sistema ROOT_ID = “0” DATE = `date` NO_USERS =` who | wc-l` UPTIME = `uptime` check_root () if [” $ UID “-ne” $ ROOT_ID “]; luego repita “¡No está autorizado a ejecutar este programa!” salida 1; fi print_sys_info () echo “Hora del sistema: $ DATE” echo “Número de usuarios: $ NO_USERS” echo “Tiempo de actividad del sistema: $ UPTIME” check_root print_sys_info exit 0
Ahora verifique sintácticamente el script una vez más.
$ sudo bash-n sys_info.sh
El comando anterior no producirá ningún resultado 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.sh
Ejecución del script de Trace Shell
Ahora ejecute el script.
$ sudo ./sys_info.sh
Secuencia de comandos de shell para mostrar la fecha, la hora y el tiempo de actividad
Importancia del rastreo de ejecución de secuencias de comandos de Shell
El rastreo de secuencias de comandos de Shell nos ayuda a identificar errores de sintaxis y, lo que es más importante, errores lógicos. Tomemos, por ejemplo, la función check_root en el script de shell sys_info.sh, que está destinado a determinar si un usuario es root o no, ya que el script solo puede ser ejecutado por el superusuario.
check_root () if [ “$ UID”-ne “$ ROOT_ID”]; luego repita “¡No está autorizado a ejecutar este programa!” salida 1; fi
La magia aquí está controlada por la expresión de instrucción if [“$ UID”-ne “$ ROOT_ID”], una vez que no usamos el operador numérico adecuado (-ne en este caso, que significa no igual), terminamos con un posible error lógico.
Suponiendo que usamos-eq (significa igual a), esto permitiría a cualquier usuario del sistema así como al usuario root ejecutar el script, por lo tanto, un error lógico.
check_root () if [“$ UID”-eq “$ ROOT_ID”]; luego repita “¡No está autorizado a ejecutar este programa!” salida 1; fi
Nota. Como vimos antes al comienzo de esta serie, el comando integrado set shell 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 información breve del sistema ROOT_ID = “0” DATE = `date` NO_USERS =` who | wc-l` UPTIME = `uptime` check_root () if [” $ UID “-eq” $ ROOT_ID “]; luego repita “¡No está autorizado a ejecutar este programa!” salida 1; fi print_sys_info () echo “Hora del sistema: $ DATE” echo “Número de usuarios: $ NO_USERS” echo “Tiempo de actividad del sistema: $ UPTIME” # activando y desactivando la depuración de la función check_root set-x; check_root; establecer + x; print_sys_info exit 0
Guarde el archivo e invoque el script, podemos ver que un usuario normal del sistema puede ejecutar el script sin sudo. como se muestra 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. que es 0.
$ ./sys_info.sh
Ejecutar script de shell sin sudo
Bueno, eso es todo por ahora, hemos llegado al final de la serie de depuración de scripts de shell, el formulario de respuesta a continuación se puede utilizar para abordar cualquier pregunta o comentario sobre esta guía o toda la serie de 3 partes.