Bases de l'automatisation Bash et scripts (partie 3)

Contenu

Shutterstock / Mopic

Dans ce dernier article de notre série en 3 parties sur les bases de l'automatisation et des scripts bash, nous allons explorer le débogage de script, exécuter des scripts en tant que procédure d'arrière-plan et importer d'autres scripts à l'aide de la commande source.

Bases de l'automatisation Bash et scripts

Si vous voulez commencer par le commencement, lea nuestro post Bash Automation and Scripting Basics Part 1. Ce dernier article de notre série en trois parties sur l'automatisation bash et les bases des scripts traitera de l'exécution de scripts en tant que procédure d'arrière-plan..

Nous souhaitons également déboguer rapidement nos scripts avec un minimum de complications et des résultats haut de gamme.. Cela peut être fait en utilisant une fonction de trace très utile, intégré directement dans le shell bash. Nous verrons cela dans le deuxième sujet. Vous pouvez également garder un œil sur notre prochain article sur le shellcheck associé.

Et pour finir, nous allons explorer comment exécuter des scripts en tant que procédure d'arrière-plan. Bien que cela puisse offrir des avantages immédiats modestes, comment démarrer plusieurs tâches en même temps, jette également une partie des bases pour des scripts multithreads plus avancés plus tard.

Débogage de scripts

Déboguer un script dans bash ne doit pas être difficile !! Gardez un œil sur le portail Web CloudSavvyIT, car nous passerons bientôt en revue l'outil de débogage shellcheck le plus complet pour Bash, mais pour le moment, je voudrais vous présenter un excellent moyen de déboguer les scripts Shell d'une manière simple et facile à comprendre.

Dans la coquille de Bash, qu'après tout c'est un “facile” binaire en cours d'exécution sur votre machine, En d'autres termes, les bash des pistes, une option est fournie (-x) Quoi, selon man bash (l'exécuter dans votre terminal affichera un Bash manuel) est décrit comme Imprimer les commandes et leurs arguments au fur et à mesure de leur exécution¡Y esto 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"
  sortir 0
else
  echo "Affirmer: could not locate the value '1' in the variables A and B"
  sortir 1
être

Un pequeño script de Bash con un error

Aquí comprobamos las variables A et B contra el valor 1. Les -o modismo en el if declaración significa OR, En d'autres termes, la primera parte (A, ou mieux AA C'est ici 1) es cierto, o la segunda parte (B il est 1) es cierto y, en tal caso, se logra el éxito.

La sortie du script sera l'assertion planifiée et le programme se terminera avec un code de sortie de 1, ce qui signifie généralement qu'il y a eu une erreur. Si le script avait fonctionné correctement, un message de confirmation s'afficherait et le script se terminerait avec un code de sortie de 0, ce qui signifie généralement que tout ce qui devait être fait avec le script ou l'utilitaire a réussi.

Ensuite, Pourquoi le script s'exécute-t-il sur assertion? Vous avez peut-être déjà remarqué que la variable A J'ai trouvé une faute de frappe dans notre if déclaration, enregistré dans le code comme AA: un insecte! Nous pourrions aller vérifier le script, et s'il est aussi court et simple que celui montré ici, l'erreur serait trouvée rapidement. Mais pour un spectacle 5000 lignes, La réponse n'est pas si simple, surtout si vous utilisez plusieurs threads, sous-couches complexes, etc.

Nous déboguons maintenant avec le -x option pour Bash. Vous vous souvenez peut-être de la deuxième partie de notre cours Bash Scripting and Automation Basics qu'un sous-shell peut être démarré à l'aide d'un $( ... ) ensemble d'idiomes. Il peut également être démarré en tapant simplement bash, o pour ce cas bash -x à l'intérieur de notre coque supérieure. Dans cette circonstance, nous allons exécuter le script dans notre sous-shell Bash, avec lui -x possibilité d'observer ce qui se passe étape par étape.

Exécuter notre script smalls avec bash -x

Alors on exécute bash -x ./test_debugging.sh et notez que le prochain contrôle conditionnel a lieu: '[' '' == 1 -o 2 == 1 ']'. Nous remarquons que quelque chose ne va pas: la valeur de 2 est comparé à 1 dans la deuxième partie de notre contrôle conditionnel, mais que se passe-t-il dans la première partie? Quelque chose est comparé à 1, mais ça quelque chose est … vide (comme indiqué par la chaîne vide '')!

Ensuite, nous vérifions dans notre script pourquoi cet endroit vide est là et pourquoi il n'a pas été rempli avec la valeur de notre A variable. On se rend vite compte de la AA au lieu de A Erreur, corrigez l'erreur et le script fonctionne maintenant correctement.

Le script corrigé avec le bug corrigé.

Quelque chose de vraiment cool à retenir lors de l'utilisation bash -x c'est que tu peux tee (lis ça comme 'Copier’) la sortie de la commande Bash redirigeant stderr (la sortie d'erreur) une sortie standard (sortie standard) et capturer la même chose avec tee:

Utilisation de tee en combinaison avec bash -x

Ici, nous exécutons notre script fixe et nous redirigeons la sortie d'erreur (bash -x envoyer toute votre sortie de débogage d'information à stderr, la sortie d'erreur standard, y pas un stdout) à l'aide de 2>&1 (qui redirige notre sortie stderr vers stdout – notre sortie standard – à sa place). Ensuite, nous capturons stdout en utilisant tee et cela enregistrera la sortie dans le fichier spécifié, a savoir bash_-x_output.txt.

Cela permet à un développeur bash de revoir lentement, dans un format pas à pas, votre code écrit. Surtout quand les programmes deviennent complexes, avoir des fonctions, devenir multithread, démarrer les processus en arrière-plan, etc., cette forme de débogage peut être très utile. Exemple, j'ai tendance à utiliser bash -x environ une fois tous les quinze jours pour déboguer des scripts complexes.

Exécution de scripts en arrière-plan

Ejecutar un script como procedimiento en segundo plano es sencillo: il suffit d’ajouter & al final del nombre del script (con un espacio entre ellos). Nous définissons background.sh comme suit:

#!/bin/bash

sleep 2

Después lo iniciamos de la próxima manera, para resaltar el hecho de que se está ejecutando en segundo plano:

Flujo de varios comandos Bash con uno de esos comandos como proceso en segundo plano

Lo que podemos ver que sucede aquí es como sigue: background.sh El script se inicia en segundo plano (dado el & adjunto al nombre del script con un espacio), et immédiatement l'invite de commande reviendra. Nous l'utilisons ici en spécifiant la commande suivante (sleep 1) juste après & langue de fond, qui termine également cette commande une seule commande / unique (En d'autres termes, sleep 1 c'est une commande absolument nouvelle).

Nous terminons également notre sleep 1 commande avec un fréquent fin de commande Bash idiome, après quoi nous exécuterons un echo qu'il sleep 1 C'est complet / Fait. Ensuite, voyons ce qui se passe dans l'exécution de cette ligne.

Immédiatement, notre procédure / script en arrière-plan (background.sh) démarre et fonctionnera pendant environ 2 secondes. Le PID (identifiant de procédure) de la procédure d'arrière-plan démarrée s'affiche visuellement (En d'autres termes, 773183 pour notre premier[1]) procédure de fond, et ce PID sera différent à chaque démarrage d'un programme / procédure de fond), et le nôtre sleep 1 (la prochaine instruction pour l'exécution) maintenant il peut être exécuté puisque l'autre programme a renvoyé notre message (même s'il n'est pas affiché directement ici, c'est ce qui se passe lorsque vous démarrez une procédure en arrière-plan; récupère immédiatement l'invite de commande).

Les sleep 1 départs (avec lui sleep 2 ou plus exactement le background.sh Le script est toujours en cours d'exécution en arrière-plan, comme une procédure différente, dans une sous-couche commencée sous cette couche de niveau supérieur ou supérieur) et se termine après 1 seconde. Après cela notre echo s'exécute, nous montrant le sleep 1 C'est complet. Une seconde plus tard, notre background.sh la procédure complète votre attente 2 secondes et se termine.

Nous ne voyons pas qu'il est terminé puisque le shell Bash s'attend à ce qu'une interaction nous montre messages d'état. Pour cela, dès que nous appuyons sur Entrée, à tout moment après la fin des deux secondes de sommeil, nous verrons la fin de la procédure d'arrière-plan comme un [1]+ Done ./background.sh message d'état. Si vous revenez à la deuxième partie de notre mini-série, il est également possible de voir comment nous aurions pu utiliser wait ici pour attendre la fin / procédure d'arrière-plan terminaison PID. Il met également en évidence le nombre de commandes et d'utilitaires pouvant être utilisés de manière combinatoire dans Bash.

Importation de scripts à l'aide la source

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

#!/bin/bash

source mysource.sh

echo "${MYVAR}"

Y el emparejamiento mysource.sh:

#!/bin/bash

MYVAR="Hello CloudSavvyIT Readers!"

Si simplemente hacemos el primer script (testsource.sh) exécutable (à l'aide de chmod +x testsource.sh), pero no el segundo script (en réalité, desarmamos la bandera ejecutable para mostrar claramente que esto funciona usando chmod -x sur mysource.sh), el segundo script se sigue llamando correctamente como consecuencia de la source commander, y se ejecuta como parte del testsource.sh texte:

Obtención de un script con el comando de origen Bash

Dans le mysource.sh scénario, nous définissons la variable MYVAR pour Hello CloudSavvyIT Readers!. Ce script est obtenu plus tard à partir de testsource.sh script utilisant des instructions source mysource.sh. Cela provoquera mysource.sh à exécuter à ce stade, le code, et quand c'est fini, les testsource.sh Le script continuera à s'exécuter, même si tout ce qui est établi dans le mysource.sh sera retenu (pensez à cela comme d'un autre script se souvenir plus facilement du fonctionnement de celui-ci).

En résumé

Nous examinons les scripts de débogage en utilisant bash -x pour afficher toutes les commandes exécutées. Nous avons également exploré comment exécuter un script en tant que procédure d'arrière-plan et appris comment importer des scripts à l'aide du code source.. Merci d'avoir été attentif à cette série de 3 les pièces, Dont ceci était le post final!

Si vous souhaitez en savoir plus sur Bash, Que diriez-vous de consulter nos articles ou Primer: Boucles Bash: pour, pendant et jusqu'à, Tests conditionnels en bash: si, alors, autre, Fonctions et variables locales elif et Bash

Abonnez-vous à notre newsletter

Nous ne vous enverrons pas de courrier SPAM. Nous le détestons autant que vous.