Conceptos básicos de la automatización y secuencias de comandos de Bash (Parte 3)


Shutterstock / Mopic

En este artículo final de nuestra serie de tres partes sobre Bash Automation y Basic Scripts, exploraremos la depuración de scripts, la ejecución de scripts como proceso en segundo plano y la importación de otros scripts utilizando el comando de origen.

Conceptos básicos de automatización y scripting Bash

Si desea comenzar por el principio, lea nuestro artículo Bash Automation and Scripting Basics Part 1. Este artículo final de nuestra serie de tres partes sobre Bash Automation and Scripting Basics analizará la ejecución de scripts como un proceso en segundo plano.

También queremos depurar rápidamente nuestros scripts con un esfuerzo mínimo y resultados de alta gama. Esto se puede hacer usando una función de rastreo muy útil, incorporada directamente en el intérprete de comandos de Bash. Examinaremos esto en el segundo tema. Es posible que también desee estar atento a nuestro próximo artículo sobre el shellcheck relacionado.

Finalmente, exploraremos cómo ejecutar scripts como un proceso en segundo plano. Si bien esto puede proporcionar beneficios inmediatos modestos, como iniciar múltiples tareas simultáneamente, también establece parte del trabajo básico para scripts de subprocesos múltiples más avanzados más adelante.

Scripts de depuración

¡La depuración de un script en Bash no tiene por qué ser difícil! Esté atento al sitio web de CloudSavvyIT tan pronto como veamos la herramienta de depuración de shellcheck más completa para Bash, pero por ahora me gustaría presentarle una excelente manera de depurar scripts de Shell de una manera simple y fácil de entender.

Dentro del shell Bash, que después de todo es un archivo "sencillo" binario que se ejecuta en su máquina, es decir, el archivo bash binario, hay una opción (-x) que, según man bash (ejecutar esto en su terminal mostrará un manual de Bash) se describe como Imprimir comandos y sus argumentos mientras se ejecutan¡Y eso es exactamente lo que hace! ¿Cómo ayudará esto con la depuración? Eche un vistazo al siguiente ejemplo:

#!/bin/bash

A=1
B=2
if [ "${AA}" == "1" -o "${B}" == "1" ]; then 
  echo "One ('1') was definitely stored in either the variable A, or the variable B"
  exit 0
else
  echo "Assert: could not locate the value '1' in the variables A and B"
  exit 1
fi

Un pequeño script de Bash con un error

Aquí comprobamos las variables A es B contra el valor 1. los -o idioma en if declaración significa OR, esa es la primera parte (A, o mejor AA aquí está 1) es cierto, o la segunda parte (B es 1) es cierto y en ese caso se logra el éxito.

La salida del script será la aserción programada y el programa terminará con un código de salida de 1, lo que generalmente significa que se ha producido un error. Si el script funcionaba correctamente, aparecería un mensaje de confirmación y el script terminaría con un código de salida de 0, lo que generalmente significa que ha tenido éxito en todo lo que se pretendía hacer con el script o la utilidad.

Entonces, ¿por qué la secuencia de comandos ejecuta la aserción? Puede que ya hayas notado que el A encontré un error tipográfico en el nuestro if declaración, registrada en el código como AA: ¡un insecto! Podríamos ir a verificar el script, y si es corto y simple como el que se muestra aquí, el error se encontraría rápidamente. Pero para un programa de 5000 líneas, la solución no es tan simple, especialmente si usa múltiples subprocesos, subcapas complejas, etc.

Depuramos ahora con el -x opción para Bash. Puede recordar de la segunda parte de nuestro curso básico de automatización y scripting de Bash que se puede iniciar un subshell utilizando un $( ... ) conjunto de modismos. También se puede iniciar simplemente escribiendo bash, o en este caso bash -x dentro de nuestra capa superior. En este caso, ejecutaremos el script dentro de nuestro subshell Bash, con la extensión -x opción para observar lo que sucede paso a paso.

Ejecutando nuestro script smalls con bash -x

Así hemos realizado bash -x ./test_debugging.sh y observe que se realiza la siguiente verificación condicional: '[' '' == 1 -o 2 == 1 ']'. Notamos que algo anda mal: el valor de 2 se compara con 1 en la segunda parte de nuestra verificación condicional, pero ¿qué está sucediendo en la primera parte? Algo se compara con 1, pero eso algo está ... vacío (como lo indica la cadena vacía '')!

Entonces revisamos nuestro script porque ese lugar vacío está allí y por qué no se ha llenado con el valor nuestro. A variable. Inmediatamente nos damos cuenta de la AA en vez de A error, corrija el error y el script ahora funciona bien.

El script arreglado con el error arreglado

Algo realmente genial para recordar al usar bash -x eso es lo que puedes tee (lee esto como 'Copiar') la salida del comando Bash redirigiendo stderr (la salida de error) a stdout (la salida estándar) y capturando la misma con tee:

Usando tee en combinación con bash -x

Aquí estamos ejecutando nuestro script fijo y redirigiendo la salida de error (bash -x enviar toda su salida de depuración informativa a stderr, salida de error estándar y no a stdout) usando 2>&1 (que redirige nuestra salida stderr a stdout, nuestra salida estándar). Luego adquirimos stdout usando tee y esto guardará la salida en el archivo especificado, es decir bash_-x_output.txt.

Esto permite que un desarrollador de Bash revise lentamente su código escrito en un formato paso a paso. Especialmente cuando los programas se vuelven complejos, tienen funciones, se vuelven multiproceso, inician procesos en segundo plano, etc., esta forma de depuración puede ser muy valiosa. Por ejemplo, tiendo a usar bash -x aproximadamente una vez cada dos semanas para depurar scripts complejos.

Ejecución de scripts como procesos en segundo plano

Ejecutar una secuencia de comandos como proceso en segundo plano es simple: simplemente coloque & al final del nombre de la secuencia de comandos (con un espacio en el medio). Definimos background.sh como sigue:

#!/bin/bash

sleep 2

Luego lo iniciamos de la siguiente manera, para resaltar el hecho de que se está ejecutando en segundo plano:

Fluir una serie de comandos Bash con uno de estos comandos como proceso en segundo plano

Lo que podemos ver que sucede aquí es lo siguiente: background.sh el guión se inicia en segundo plano (dado el & adjunto al nombre del script con un espacio) e inmediatamente volverá el símbolo del sistema. Lo usamos aquí especificando el siguiente comando (sleep 1) inmediatamente despues & idioma de fondo, que también termina ese comando con un solo comando (en otras palabras, sleep 1 es un comando completamente nuevo).

También terminamos el nuestro sleep 1 comando con un habitual fin de mando Bash idiom, después de lo cual ejecutaremos un archivo echo que el sleep 1 está completo / hecho. Ahora veamos qué sucede con la ejecución de esta línea.

Inmediatamente, nuestro proceso / script en segundo plano (background.sh) comienza y funcionará durante unos 2 segundos. El PID (identificador de proceso) del proceso en segundo plano iniciado se muestra visualmente (es decir, 773183 para nuestro primer[1]) proceso en segundo plano - y este PID será diferente cada vez que inicie un programa / proceso en segundo plano) y el nuestro sleep 1 (la siguiente instrucción a ejecutar) ahora se puede ejecutar cuando el otro programa devolvió nuestro mensaje (aunque no se muestra directamente aquí, esto es lo que sucede cuando inicia un proceso en segundo plano; obtiene el símbolo del sistema inmediatamente).

los sleep 1 empieza con sleep 2 o más precisamente el background.sh el script aún se ejecuta en segundo plano, como un proceso diferente, en una subcapa iniciada bajo esta capa superior o de nivel superior) y termina después de 1 segundo. Después de esto nuestro echo se ejecuta, mostrándonos el archivo sleep 1 Está completo. Un segundo después, nuestro background.sh el proceso se redondea hacia arriba es 2 segundos de espera y finaliza.

No lo vemos terminado ya que el shell Bash espera algunas interacciones para mostrarnos mensajes de estado. Por lo tanto, tan pronto como presionemos Enter, en cualquier momento después de que terminen los dos segundos de suspensión, veremos la conclusión del proceso en segundo plano como una [1]+ Done ./background.sh mensaje de estado. Si vuelve a la segunda parte de nuestra miniserie, es posible que también vea cómo podríamos haberla utilizado. wait aquí para esperar a que se complete / finalice el PID del proceso en segundo plano. También destaca cuántos comandos y utilidades se pueden usar de forma combinatoria en Bash.

Importación de scripts usando fuente

La importación de otro script se puede hacer fácilmente usando Bash source mando. Considere el siguiente guión testsource.sh:

#!/bin/bash

source mysource.sh

echo "${MYVAR}"

Y el partido mysource.sh:

#!/bin/bash

MYVAR="Hello CloudSavvyIT Readers!"

Si simplemente creamos el primer script (testsource.sh) ejecutable (usando chmod +x testsource.sh), pero no el segundo script (de hecho, desactivamos la bandera ejecutable para mostrar claramente que funciona usando chmod -x hasta mysource.sh), el segundo script todavía se llama correctamente como resultado de source comando y ejecutado como parte del testsource.sh texto:

Adquirir un script con el comando fuente Bash

En mysource.sh script, establecemos la variable MYVAR por Hello CloudSavvyIT Readers!. Por tanto, este guión procede de testsource.sh script usando la declaración source mysource.sh. Esto causará mysource.sh para ejecutar en ese punto el código y, una vez completado, el archivo testsource.sh la secuencia de comandos continuará ejecutándose, aunque todas las cosas establecidas en el archivo mysource.sh se mantendrá (piense en esto como viniendo de otro guión para recordar el funcionamiento de este más fácilmente).

En resumen

Analizamos la depuración de scripts usando bash -x para ver todos los comandos ejecutados. También exploramos cómo ejecutar un script como proceso en segundo plano y aprendimos cómo importar scripts usando código fuente. Gracias ¡Estén atentos a esta serie de 3 partes, de la cual este fue el último artículo!

Si está interesado en obtener más información sobre Bash, consulte nuestros artículos o Primer: Bash Loops: para, mientras y hasta, Prueba condicional en Bash: if, then, else, elif y Bash Funciones y variables locales

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir