diff --git a/content/articles/2022/bash_gerer_les_messages_avance/index.md b/content/articles/2022/bash_gerer_les_messages_avance/index.md index 1c7c39b..e055f61 100644 --- a/content/articles/2022/bash_gerer_les_messages_avance/index.md +++ b/content/articles/2022/bash_gerer_les_messages_avance/index.md @@ -2,12 +2,13 @@ Title: Bash avancé: Gérer les messages Category: sysadmin Tags: bash, script, pl-fr Date: 2022-01-30 1:30 +Modified: 2022-01-30 13:56 Cover: assets/backgrounds/article_bash_messages.jpg Dans ce premier article de l'année 2022, nous allons voir comment gérer les -messages de sorties de nos scripts Bash. L'idée ici est de proposer trois type -de messages dans un fichiers que nous pourrons ensuite inclure dans nos scripts -à l'aide de la commande `source`. +messages de sorties de nos scripts *bash*. L'idée ici est de proposer trois +types de messages dans un fichier que nous pourrons ensuite inclure dans nos +scripts à l'aide de la commande `source`. Ces messages seront de 3 types différents: @@ -52,11 +53,11 @@ error() { Vous remarquez que les fonctions `error` et `debug` utilisent la fonction `message` mais son appel est précédé de `>&2` afin que la sortie se fasse sur -`SRDERR`. +**la sortie d'erreur**. Le `printf` de notre fonction `msg` utilise `%b` pour afficher le contenu de la -`message`. Ainsi les séquences échappées par un antislash seront interprétées. -Nous aborderons le sujets dans la partie suivante. +variable `message`. Ainsi les séquences échappées par un antislash seront +interprétées. Nous aborderons le sujets dans la partie suivante. Pour les tester, créons un script `test.sh` dans le même répertoire que notre librairie avec le code suivant: @@ -65,7 +66,7 @@ que notre librairie avec le code suivant: #!/usr/bin/env bash # inclusion de notre librairie de message, il ne faut pas oublier -# d'afficher une erreur et teminer notre script si il y a un problème +# d'afficher une erreur et teminer notre script s'il y a un problème # lors de son chargement. source message.sh || { >&2 printf "Can't load message.sh"; exit 1; } @@ -111,24 +112,31 @@ de débogages debug() { local message="$*" [[ -z $DEBUG || $DEBUG -ne 1 ]] && return + + # \e[34m permet de choisit la couleur bleu pour afficher notre message + # \e[0m permet de revenir à la normale [ -n "$message" ] && >&2 msg "\e[34mDEBUG: $message\e[0m" } error() { local message="$*" + + # \e[31m permet de choisir le rouge [ -n message ] && >&2 msg "\e[31mERROR: $message\e[0m" } ``` Ici la commande `\e[34m` permet de choisir la couleur bleue et `\e[0m` de revenir à la normale. C'est ici que le choix de `%b` pour le formatage de la -variable `$message` est important: **`printf` interprètera nos commande -échappées avec l'antislash**. +variable `$message` est important dans notre fonction `msg`: **`printf` +interprètera nos commandes échappées avec l'antislash**. La couleur c'est bien, mais si on décide de rediriger une sortie (ou les deux) de notre script dans un fichier voici son contenu ouvert dans `vim`: ```none +$ DEBUG=1 ./test.sh >error.txt 2>&1 +$ vim error.txt DEBUG: We will display a message Test Message DEBUG: We will display an error @@ -148,15 +156,19 @@ comme dans la plupart des applications qui effectuent de la journalisation. Bash dispose d'un opérateur de test permettant de savoir si la sortie demandée est un terminal interactif ou non: `-t`. +Il est aussi intéressant de ne pas inclure les informations de couleur lors de +la redirection de la sortie vers un fichier, le problème évoqué dans la partie +précédente est réglé. + Le code prend un peu de poids : - * On ajoute une condition dans chacune de nos trois fonction d'origine afin de + * On ajoute une condition dans chacune de nos trois fonctions d'origine afin de tester le type de sortie. * On y ajoute une fonction `log` qui se charge de traiter notre sortie lorsque elle est redirigée vers un fichier en ajoutant une information de date / heure au début de la ligne. * Le format de cette date est paramétrable à l'aide de la variable `$DATE_FMT`, - dans l'exemple un *timestamp*. + dans l'exemple un [*timestamp*](l_w_timestamp). Voici le nouveau code : @@ -265,7 +277,7 @@ myfunct() { } ``` -Et modifions notre fichier `test.sh` afin d'inclure notre fichier comme +Et modifions notre fichier `test.sh` afin de *"sourcer"* notre fichier comme ci-dessous : ```bash @@ -289,7 +301,7 @@ DEBUG [./test.sh:main]: We will display a message Test Message ``` -Le fichier source et la fonction appelée sont bien affichés. Bash dispose +Le fichier source et la fonction appelée sont bien affichés. *Bash* dispose d'autre variables utiles que vous trouverez dans l'aide : `man bash`. ## Améliorer les sorties d'erreur @@ -391,8 +403,10 @@ Nous avons vu tout au long de cet article comment utiliser des fonctions pour afficher vos messages, que se soit pour déboguer, afficher des erreurs ou de simples messages. -Pensez que vous pouvez placer votre "bibliothèque" dans un endroit pr esent dans +Pensez que vous pouvez placer votre "bibliothèque" dans un endroit présent dans la variable d'environnement `$PATH` et ainsi l'inclure dans n'importe quel script. Les fichiers d'exemple sont disponibles [ici]({attach}files/scripts.tar.gz). + +[l_w_timestamp]:https://fr.wikipedia.org/wiki/Heure_Unix