[gull] Truc et astuces: bash connector
felix
felix at f-hauri.ch
Tue Feb 6 17:42:44 CET 2018
Bonjour,
Intro:
J'ai réalisé des ``connecteurs bash'' pour simples commandes répondant
une ligne par une ligne, ou pour des clients SQL, testée avec
"sqlite3" (3.16.2 2017-01-06), "mysql" (Ver 15.1 Distrib 10.1.26-MariaDB)
et "psql" (PostgreSQL 9.6.6).
A noter que les connecteurs SQL, utilisant les tabulations `\t` comme
séparateurs, les champs ou réponses ne doivent pas en contenir!!
A repenser en fonction du client et des séparateurs probables (voire
multi-caractères).
Présentation:
Pour effectuer un calcul, on peut utiliser `bc`:
myPi=$(bc -l <<<'4*a(1)')
Pour interpréter une date, on peut utiliser `date -d ""`
myUnixDate=$(date -d "2018-01-01 00:00 CET" +%s)
Pour ces opération, on lance un "fork" (sous-process) qui se termine
à chaque fois (ouverture d'un process, démarrage du binaire, transmission
données et résultat, fermeture du process).
Or ces commandes peuvent fournir plus d'une réponse. Il vaut donc la
peine, si l'on doit se réferer à ces comandes de manière répétitive,
de trouver un moyen de n'initier qu'un seul "fork" et de converser avec.
Test de base:
mkfifo /tmp/myFifoForBc
exec 5> >(bc -l >/tmp/myFifoForBc)
exec 6</tmp/myFifoForBc
rm /tmp/myFifoForBc
Le fifo peut être effacé car il est déjà ouvert en lecture et en ecriture.
Cela permet d'éviter que d'autre l'utilisent et évite l'oubli en fin de
tâche.
De là:
echo "3*4" >&5
read -u 6 foo
echo $foo
12
mais tant que l'on de ferme pas les ``fd'' (5 et 6, en l'occurence), on
peut continuer d'utilise `bc` qui est *déjà* lancé et prêt.
echo >&5 "pi=4*a(1)"
echo >&5 "2*pi*12"
read -u 6 foo
echo $foo
75.39822368615503772256
Bref, j'en ai fait un fichier de librairie à "sourcer" ou à lancer pour
la démo:
https://f-hauri.ch/vrac/shell_connector.sh
Question et commentaires bienvenus...
--
Félix Hauri - <felix at f-hauri.ch> - http://www.f-hauri.ch
More information about the gull
mailing list