¿Cómo depurar un script bash?

How Debug Bash Script




Cualquier programa debe estar libre de errores antes de llegar a los consumidores. Los desarrolladores de software hacen todo lo posible para que los programas de software estén libres de errores. Pero es difícil hacer que un código sea impecable cuando hay miles de líneas. La depuración es un proceso continuo; ayuda a detectar errores de inmediato, recopilar información valiosa sobre el código y eliminar fragmentos de código redundantes.

Todos los lenguajes de programación tienen algunos enfoques comunes y pocos distintos para encontrar errores. Por ejemplo, los programas de depuración se pueden utilizar para eliminar errores rápidamente. Mientras que los scripts de shell no tienen ninguna herramienta en particular para depurar el código. Este artículo trata sobre la discusión de varias técnicas de depuración que pueden usarse para hacer que el script bash esté libre de errores. Antes de sumergirnos en los métodos, tengamos una comprensión básica de los shells y sus scripts:







¿Qué es el shell en Linux?

Cuando enciende su computadora, el kernel obtiene información sobre el hardware adjunto y permite que otros componentes conectados interactúen. Aparte de eso, administra la memoria, la CPU y reconoce cualquier nuevo periférico. Con todo, un kernel es la columna vertebral de cualquier sistema operativo. Pero, ¿alguna vez ha pensado en interactuar directamente con el kernel, ordenarle que realice una tarea específica? ¿Es incluso factible hacer eso? ¡Absolutamente! Con la ayuda de un shell, un programa de computadora con una interfaz interactiva, cualquiera puede operar el kernel. El shell permite a los humanos interactuar con el kernel e indicarle que realice cualquier tarea.



En Unix, hay dos shells principales Concha de Bourne y Cáscara de C . Ambos tipos tienen sus subcategorías. Los diferentes tipos de conchas de Bourne son Caparazón de Korn (ksh), caparazón de Almquist (ceniza), caparazón de Bourne nuevamente (bash), y Cáscara Z (zsh) . Al mismo tiempo, el shell C tiene sus propias subcategorías como Shell C (csh) y Carcasa TENEX C (tcsh) . Como se mencionó anteriormente, de todas las conchas, Bash (Bourne de nuevo shell) es el shell más utilizado y viene listo para usar en muchas distribuciones de Linux debido a su eficiencia y facilidad de uso.



Bash es el shell predeterminado de muchas distribuciones de Linux y millones de usuarios de Linux lo utilizan ampliamente. Es tan diverso e influyente que puede realizar todas las tareas que realiza habitualmente en aplicaciones basadas en GUI. Puede editar archivos, administrar archivos, ver fotos, escuchar música, reproducir videos y mucho más.





¿Qué es un script de Shell?

Como hemos aprendido la idea básica de shell, ahora avancemos hacia el script de shell. El script de shell es un programa informático que ejecuta varios comandos en un shell que actúa como intérprete para realizar una función específica. Como se mencionó anteriormente, hay 2 tipos particulares de conchas. Sin embargo, esta guía se centra en el shell Bourne Again (Bash).
Entonces, ¿qué es un script bash? En Linux, todos los comandos de bash se almacenan en / usr / bin y / bin carpetas. Por ejemplo, cada vez que ejecuta un comando, bash busca si existe en el directorio o no. El comando se ejecuta si se encuentra en los directorios; de lo contrario, da un error.

¿Qué tal realizar una tarea que necesita varios comandos para ejecutarse en la terminal? En esta situación específica, las secuencias de comandos bash pueden ayudarlo. La secuencia de comandos de bash es una forma de secuencia de comandos de shell que le permite crear programas para ejecutar varios comandos de bash para realizar una tarea específica.



¿Cuáles son los errores en las secuencias de comandos de bash?

Mientras trabaja con bash scripting o con cualquier otro lenguaje de programación, se encuentra con muchos errores. Un error es un error o una falla en el programa que puede hacer que el programa se comporte incorrectamente.

Cada lenguaje de programación tiene su propio procedimiento para encontrar errores; de manera similar, bash también tiene muchas opciones integradas para depurar un programa de terminal.

Administrar errores y depurar un programa es nada menos que una molestia. Es un trabajo que requiere mucho tiempo y puede empeorar si no conoce las herramientas adecuadas para depurar su programa. Este artículo es una guía completa sobre la depuración de scripts bash para que su script esté libre de errores. Vamos a empezar:

Cómo depurar un script bash:

Cuando trabaja en grandes proyectos de programación, se encuentra con muchos errores o errores. A veces, depurar un programa puede resultar complicado. Los programadores suelen utilizar herramientas de depuración y muchos editores de código también ayudan a encontrar errores al resaltar la sintaxis.

Hay varias herramientas en Linux para depurar códigos, por ejemplo, GNU Debugger también conocido como gdb. Las herramientas como GDB son útiles para los lenguajes de programación que se compilan en binarios. Dado que bash es un lenguaje interpretado simple, no hay necesidad de herramientas pesadas para depurarlo.

Existen varias técnicas tradicionales para depurar un código de scripting de bash, y una de ellas es agregar Afirmaciones. Las afirmaciones son condiciones que se agregan en los programas para verificar condiciones específicas y ejecutar el programa en consecuencia. Es una técnica defensiva que ayuda a encontrar errores y también a realizar pruebas. Puedes encontrar muchos instrumentos que ayudan a agregar aserciones en scripts bash.

Bueno, agregar afirmaciones es una de las viejas técnicas tradicionales. Hay conjuntos de banderas / opciones disponibles en bash para depurar un script bash. Estas opciones se pueden agregar junto con shebang en los scripts o agregar mientras se ejecuta el programa en la terminal. Los temas que vamos a abordar se enumeran a continuación:

  1. Cómo depurar el script bash habilitando detallado -v opción
  2. Cómo depurar el script bash usando xtrace -x opción
  3. Cómo depurar el script bash usando noexec -n opción
  4. Cómo identificar el variables no definidas mientras se depura el script bash
  5. Cómo depurar el parte especifica del guión bash
  6. Cómo depurar un script bash usando el trampa mando
  7. Cómo depurar un script bash eliminando archivo globbing utilizando el -F opción
  8. Cómo combinar opciones de depuración para depurar un script de shell
  9. Cómo redireccionar informe de depuración a un archivo

Así que revisemos varias técnicas en bash para depurar un script bash:

1. Cómo depurar el script bash habilitando la opción verbose -v:

Uno de los enfoques más fáciles para depurar el script bash es usar el -v opción, también conocida como verbose. La opción se puede agregar con el shebang o se puede poner explícitamente con el nombre del archivo de secuencia de comandos mientras se ejecuta. La opción detallada ejecutará e imprimirá cada línea del código como el proceso del intérprete. Vamos a entenderlo con un ejemplo de secuencia de comandos de bash:

#! / bin / bash
echo 'Ingrese Número1'
leernumero 1
echo 'Ingrese Número2'
leerNúmero 2
si [ '$ número1' -gt '$ number2' ]
luego
echo 'Número1 es mayor que Número2'
elif [ '$ número1' -eq '$ number2' ]
luego
echo 'Número1 es igual a Número2'
demás
echo 'Número2 es mayor que Número1'
ser

El código anterior obtiene dos números del usuario y luego realiza algunas declaraciones condicionales para verificar si el número es más significativo, menor o igual al otro número ingresado. Aunque se puede usar cualquier editor de texto para scripts bash, estoy usando el editor Vim. Vim es un editor poderoso y rico en funciones que resalta la sintaxis de los scripts bash y reduce las posibilidades de errores de sintaxis. Si no tiene el editor Vim, consígalo ejecutando el comando que se menciona a continuación:

$sudoaptoInstalar en pc yo vine

Cree un archivo de script bash usando:

$yo vineb_script.sh

Si es nuevo en el editor de Vim, le recomiendo que aprenda cómo usar el editor vim antes de continuar.

Ahora, de vuelta a la secuencia de comandos, ejecute la secuencia de comandos utilizando -v opción:

$intento -vb_script.sh

Se puede ver en el resultado anterior que cada línea del script se imprime en la terminal a medida que el intérprete las procesa. Tenga en cuenta que la secuencia de comandos dejará de recibir información del usuario y luego procesará la siguiente línea de la secuencia de comandos. Como se discutió anteriormente que el -v La opción se puede colocar después de shebang como se muestra a continuación:

#! / bin / bash -v

De manera similar, la bandera verbosa también se puede agregar en la siguiente línea de shebang usando el colocar mando:

#! / bin / bash
colocar -v

Cualquiera de los métodos discutidos anteriormente puede habilitar verbose.

2 Cómo depurar el script bash usando la opción xtrace -x:

El rastreo de ejecución, también conocido como xtrace, es una opción de depuración inteligente y útil, especialmente para rastrear errores lógicos. Los errores lógicos suelen estar asociados con variables y comandos. Para comprobar el estado de la variable durante la ejecución del script, utilizamos el -x opción. Ahora de nuevo, ejecute el b_script.sh archivo con el -x bandera:

$intento -xb_script.sh

La salida muestra explícitamente el valor de cada variable durante el proceso de ejecución. De nuevo, el -x se puede usar al lado del shebang y después de la línea shebang usando el comando set. El xtrace pone el signo + con cada línea del script.

3 Cómo depurar el script bash usando la opción noexec -n:

Los errores de sintaxis son una de las principales causas de errores. Para depurar sintácticamente el script bash, usamos noexec (sin ejecución) modo. La opción utilizada para el modo noexec es -norte. Solo mostrará los errores de sintaxis del código en lugar de ejecutarlo. Un enfoque mucho más seguro para depurar el código. Ejecutemos b_script.sh de nuevo con el -norte opción:

$intento -norteb_script.sh

No habrá ejecución de código si no hay error de sintaxis. Ahora, modifiquemos nuestro código:

#! / bin / bash

echo 'Ingrese Número1'
leernumero 1
echo 'Ingrese Número2'
leerNúmero 2
si [ '$ número1' -gt '$ number2' ]
luego
echo 'Número1 es mayor que Número2'
elif [ '$ número1' -eq '$ number2' ]
#luego
echo 'Número1 es igual a Número2'
demás
echo 'Número2 es mayor que Número1'
ser

Estoy comentando luego después elif . Ahora, con -n ejecutar b_script.sh texto:

$intento -norteb_script.sh

Como se anticipó, identificó claramente el error y lo mostró en el terminal.

4 Cómo identificar las variables no configuradas mientras se depura el script bash:

Es común cometer un error tipográfico al escribir un código. A menudo, escribe mal una variable, lo que no permite que se ejecute el código. Para identificar tal error, utilizamos el -u opción. Modifiquemos el código nuevamente:

#! / bin / bash
echo 'Ingrese Número1'
leernumero 1
echo 'Ingrese Número2'
leerNúmero 2
si [ '$ num1' -gt '$ number2' ]
luego
echo 'Número1 es mayor que Número2'
elif [ '$ número1' -eq '$ number2' ]
luego
echo 'Número1 es igual a Número2'
demás
echo 'Número2 es mayor que Número1'
ser

En el primero si declaración condicional, renombré la numero 1 variable a num1 . Ahora num1 es una variable no definida. Ahora ejecute el script:

$intento -ub_script.sh

La salida ha identificado y muestra explícitamente el nombre de una variable no configurada.

5. Cómo depurar la parte específica del script bash:

El modo xtrace procesa cada línea del código y da salida. Sin embargo, encontrar errores en un código grande llevaría mucho tiempo si ya sabemos qué parte puede causar el error. Afortunadamente, xtrace también le permite depurar una parte específica del código, lo que se puede lograr usando el colocar mando. Lugar set -x al comienzo de la parte que debe depurarse y luego establecer + x al final. Por ejemplo, quiero depurar las declaraciones condicionales de b_script.sh , por lo que incluiré todas las declaraciones condicionales en set -x y establecer + x opciones como se muestra en el código siguiente:

#! / bin / bash
echo 'Ingrese Número1'
leernumero 1
echo 'Ingrese Número2'
leerNúmero 2
colocar -x
si [ '$ número' -gt '$ number2' ]
luego
echo 'Número1 es mayor que Número2'
elif [ '$ número1' -eq '$ number2' ]
luego
echo 'Número1 es igual a Número2'
demás
echo 'Número2 es mayor que Número1'
ser
colocar+x

Ahora, ejecute el script usando bash b_script.sh .

La salida solo depura las condiciones if como se especifica.

6. Cómo depurar un script bash usando el comando trap:

Si su script es complicado, también existen técnicas más elaboradas para la depuración. Uno de ellos es el trampa mando. los trampa comando capta las señales y ejecuta un comando cuando ocurre una situación específica. El comando puede ser una señal o una función. He creado otro script con el nombre de sum_script.sh :

#! / bin / bash
trampa 'echo' Línea $ {LINENO}: El primer número es $ número1, el segundo número es $ número2 y la suma es $ suma ''DEPURAR
echo 'Ingrese el primer número'
leernumero 1
echo 'Ingrese el segundo número'
leerNúmero 2
suma=$[número1 + número2]
echo 'la suma es$ suma'

los trampa comando con DEPURAR señal muestra el estado de las variables numero 1 , Número 2 y suma después de la ejecución de cada línea como se muestra en la siguiente imagen de salida:

Los bloques amarillos son espacios en blanco porque el usuario aún no ha ingresado ninguna entrada; estos espacios se llenarán a medida que el usuario ingrese valores. Este método también es muy útil para depurar scripts de bash.

7. Cómo depurar un script bash eliminando la acumulación de archivos mediante la opción -f:

El globbing de archivos es un proceso de búsqueda de archivos con caracteres comodín, es decir, * y ? . En muchas situaciones, no es necesario expandir archivos durante la depuración. En tales casos, puede bloquear el archivo global mediante el -F opción. Vamos a entenderlo con un guión. fglobe_script.sh :

#! / bin / bash
echo 'Mostrar todos los archivos de texto'.
ls *.TXT

El código anterior mostrará todos los archivos de texto en el directorio actual, ejecute:

$intentofglobe_script.sh

Para desactivar el agrupamiento de archivos, utilice el -F opción:

$intento -Ffglobe_script.sh

Del mismo modo, puedes usarlo con el shebang y con el colocar comando también:

#! / bin / bash
echo 'Mostrar todos los archivos de texto'.
ls *.TXT
colocar -F
echo 'Mostrar todos los archivos de texto'
ls *.TXT
colocar+ f

Ahora, corre bash fglobe_script.sh:

La porción incluida con conjunto -f / conjunto + f Las opciones no procesaron comandos con caracteres comodín.

8. Cómo combinar las opciones de depuración para depurar el script de shell:

Usamos solo una opción en las técnicas de depuración mencionadas anteriormente, pero podemos combinar varias opciones para una mejor comprensión. Implementemos -x y -v opciones a la sum_script.sh texto. Estoy usando el sum_script.sh texto.

#! / bin / bash
echo 'Ingrese el primer número'
leernumero 1
echo 'Ingrese el segundo número'
leerNúmero 2
suma=$[número1 + número2]
echo 'la suma es$ suma'

Ahora ejecuta:

$intento -xvsum_script.sh

Ambos -x y -v las salidas se combinan, como se muestra en la imagen de salida. Del mismo modo, también podemos combinar el -u opción con verbose -v para la detección de errores. Estoy reemplazando el numero 1 variable con en uno en la sexta línea del guión:

#! / bin / bash
es$ number2ysumaes$ suma'' DEPURACIÓN
echo '
Ingrese el primer número'
leer numero1
echo '
Ingrese el segundo número'
leer número 2
suma = $ [num + número2]
echo '
lossumaes$ suma'

Para ver el resultado, ejecute el comando que se menciona a continuación:

$intento -uvsum_script.sh

9. Cómo redirigir el informe de depuración a un archivo:

Guardar un informe de depuración de un script bash en un archivo puede resultar útil en muchas situaciones. Es un poco complicado porque redirigir debug-report a un archivo; utilizamos algunas variables especiales. Implementémoslo en b_script.sh código:

#! / bin / bash
ejecutivo 5>dubug_report.log
BASH_XTRACED='5'
PS4='$ LINENO--'
echo 'Ingrese Número1'
leernumero 1
echo 'Ingrese Número2'
leerNúmero 2
si [ '$ número' -gt '$ number2' ]
luego
echo 'Número1 es mayor que Número2'
elif [ '$ número1' -eq '$ number2' ]
luego
echo 'Número1 es igual a Número2'
demás
echo 'Número2 es mayor que Número1'
ser

En la segunda línea del código, se puede ver que estamos redirigiendo la salida a un debug_report.log archivo usando el ejecutivo comando con descriptor de archivo 5 (FD5).

exec 5> debug_report.log: los ejecutivo el comando está redirigiendo todo lo que sucede en el shell a un archivo debug_report.log.

BASH_XTRACEFD = 5: Es un variable de bash particular y no se puede utilizar en ningún otro shell. Debe asignársele un descriptor de archivo válido, y bash escribirá la salida extraída en debug_report.log.

PS4 = ’$ LINENO– ‘: También es una variable bash que se usa para imprimir el número de línea mientras se depura usando el modo xtrace. El valor predeterminado de PS4 es el + firmar

El script anterior está generando un archivo de registro llamado debug_report.log, para leerlo, usa el gato mando:

Conclusión:

Un código lleno de errores puede afectar el rendimiento del programa y también dañar el hardware. La depuración es muy importante para todos los programas, ya que hace que el programa sea más eficiente. Encontrar errores existentes y potenciales durante el desarrollo de un programa puede evitar que su programa se comporte inesperadamente. Los códigos grandes generalmente necesitan una depuración activa, lo que mejora la efectividad del código al eliminar los fragmentos de código que consumen recursos.

Muchos lenguajes y entornos de programación tienen sus propios depuradores complementarios. En bash scripting, se pueden implementar varias técnicas para depurar el script. Esta guía se centró a fondo en todos los métodos que se pueden utilizar para encontrar errores en los scripts de bash. Entonces, siempre que sienta que su script bash no se comporta como se esperaba, use cualquiera de las técnicas mencionadas anteriormente, pero el modo xtrace (-x) es bastante útil en la mayoría de los casos.