Concept des boites noires en shell
UNIX (bientôt 50 ans d'existence) a une philosophie que j'aime beaucoup. Ces créateurs ont voulu créer une grosse boite de jeu pour les adultes, style Lego, dans laquelle, les développeurs piochent ce qu'ils ont besoin pour réaliser une application ;-) C'est une métaphore mais l'idée est là...
Mettre en oeuvre un design, une idée, un concept. Quand le design fonctionne, on se préoccupe de la vitesse d'exécution après !
Le shell est un langage de glue permettant de faire communiquer entre eux des programmes (compilés ou non). Reste, pour vous concepteur, à choisir ces programmes (c'est là que la veille technologique prend tout son sens, car il y a des développeurs talentueux qui réalisent des choses admirables pour diverses problématiques)
Deuxième idée, tout est fichier même les process en cours ou les sockets réseau.
Troisième idée, les tuyaux ou pipes ("païpe" en froggy). Le résultat d'un traitement de données peut être envoyé en entrée au programme suivant et ainsi de suite...
C'est comme de la plomberie logicielle. Dans le monde physique, si vous voulez monter un filtrage pour votre eau, qui est trop "dure", vous allez d'abord mettre un filtre à sable, suivi d'un filtre anti-calcaire etc...
Cette idée novatrice, à l'époque, permet de réaliser des fonctions logicielles complexes sur une seule ligne de code shell ! Essayez de faire ça dans un autre langage, ce sont des dizaines de lignes de code source qu'il vous faudra...
Je rappelle qu'un shell (bash, ksh, csh, ash...) est une pièce essentielle d'un OS UNIX car il est situé juste au dessus du noyau et est en prise directe avec lui.
Comment coder en shell pour piloter ces boites noires ?
L'idée est de faire en sorte que toutes les variables d'un script soient située à l'extérieur de celui-ci. Cela permet de modifier ces variables sans toucher au code du script ! D'autant plus s'il a été testé dans tous les sens pour servir de brique logicielle à vos design.
J'utilise pour cela un fichier texte appelé MIB (Management Information Base), concept identique à la gestions des nodes (noeuds actifs) d'un réseau avec le protocole SNMP. A une époque lointaine, j'avais réalisé un système de surveillance réseau pour les nodes (serveurs/switchs) en production (avec l'excellentissime utilitaire braa).
Ci-dessus, allure d'une partie de la MIB pour ce site.
Snippet du code shell pour extraire une variable
SYSTEM=$(grep ^site MIB | awk -F"=" '{print $2}') MAKER=$(grep ^maker MIB | awk -F"=" '{print $2}')
Signification :
La variable SYSTEM a pour valeur le résultat de la recherche du motif site par grep situé à droite du signe =.
Le signe "caret" (flèche du haut), collé à gauche de ^site signifie commençant à la première colonne du texte. Cela évide certaines confusions.
En shell, $(.......) signifie le résultat de la commande va à gauche...Sorte de pipe inversé, utilisé principalement pour affecter une valeur à une variable.
Autre exemple de la puissance d'un script shell
new=$(echo "$fichier" | sed s/\ /_/g | sed s/,/_/g | sed s/\'/_/g | sed s/\?/_/g | recode -f utf8..flat)
Sert à renommer des fichiers en supprimant les espaces, les virgules, les apostrophes, les points ? et enfin en les recodant en ASCII pur sans accents !
Conclusion
Comme dans n'importe quel design d'un produit, qu'il soit matériel ou logiciel, ce qui compte c'est la qualité perçue par l'utilisateur !
C'est ce qui fait la différence entre un produit bien foutu et agréable à utiliser ou un truc infâme...
Hasta la vista