URL: https://linuxfr.org/users/jul/journaux/mr_freeze-sh-un-utilitaire-de-capture-de-commandes-parametree Title: mr_freeze.sh un utilitaire de capture de commandes paramétrée Authors: Jul Date: 2025年11月09日T15:03:45+01:00 License: CC By-SA Tags: bash, cadriciel et test Score: 3 Est-ce que les gags les moins longs notamment sur celui d'insister sur le fait que bash est un langage de programmation, ne seraient pas les plus courts ? Et bien non. Mi rigolade, mi sérieux, j'aimerais vous introduire à un projet pour lequel, mes connaissances que je tente toujours d'étendre jusqu'à mes limites d'incompréhension et que je viens d'atteindre, pour lequel, dis je, il y a une utilité. Le code est ici : [https://gist.github.com/jul/ef4cbc4f506caace73c3c38b91cb1ea2](https://gist.github.com/jul/ef4cbc4f506caace73c3c38b91cb1ea2) et si vous faîtes ` ./mr_freeze.sh usage ` vous aurez l'aide. # Comment ça marche Déjà le programme arrive avec son jeu de test (pour moi) dont on enregistre les sorties ainsi ``` ./mr_freeze.sh freeze input 'a*' badass 'oh un espace' ``` On enregistre pour toutes les LIGNES (pas de continuation avec \ possible) avec une commande par ligne qui peut avoir une variable $A ... $H permettant d'accéder à 3ドル ... 10ドル les résultats des commandes et la sortie est ainsi : ``` ✍️ recording: uname -a #immutable ✍️ recording: date # mutable ✍️ recording: slmdkfmlsfs # immutable ✍️ recording: du -sh #immutable (kof kof) ✍️ recording: du #immutable (kof kof) ✍️ recording: ls "$A" #mutable according to \3ドル" ✍️ recording: ssh $B 'uname -a' ✅ [replay_input] created use [./mr_freeze.sh thaw "replay_input" "a*" "badass" "oh un espace"] to replay ``` et quand on entre la commande ``` ./mr_freeze.sh thaw "replay_input" "a*" "badass" "oh un espace" ``` on obtient ``` 👌 uname -a #immutable 🔥 date # mutable @@ -1 +1 @@ -dim. 09 nov. 2025 14:05:01 CET +dim. 09 nov. 2025 14:06:01 CET 👌 slmdkfmlsfs # immutable 👌 du -sh #immutable (kof kof) 👌 du #immutable (kof kof) 👌 ls "$A" #mutable according to \3ドル" 👌 ssh $B 'uname -a' ``` la date qui est mutable ayant changé on a un diff de la sortie et mieux si on entre : ``` ./mr_freeze.sh thaw "replay_input" "a*" "petiot" ``` on obtient : ``` 👌 uname -a #immutable 🔥 date # mutable @@ -1 +1 @@ -dim. 09 nov. 2025 14:07:34 CET +dim. 09 nov. 2025 14:07:46 CET 👌 slmdkfmlsfs # immutable 👌 du -sh #immutable (kof kof) 👌 du #immutable (kof kof) 👌 ls "$A" #mutable according to \3ドル" 🔥 ssh $B 'uname -a' @@ -1 +1 @@ -Linux badass 6.8.0-85-generic #85-Ubuntu SMP PREEMPT_DYNAMIC Thu Sep 18 15:26:59 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux +FreeBSD petiot 14.3-RELEASE-p5 FreeBSD 14.3-RELEASE-p5 GENERIC amd64 ``` Ce qui est ma foi for pratique. Et en plus, j'ai pas la couleur en markdown, mais sinon la sortie du diff est colorée car JE DÉTESTE les gens en ksh/sh sous BSD ... ssh. Mouhahahaha # Un petit tour des curiosités du code. J'ai pas que coder parce que j'avais un besoin, j'avais aussi envie de m'amuser, par exemple avec cette manière particulière de gérer les espaces passés dans la ligne de commande, sur le quel je m'arrachais les cheveux (peu nombreux qui me restent) en faisant une belle pirouette planquée dans du code que je préparais pour un troll futur : faisons du fonctionnel en bash. Donc, je suis comme tout le monde, j'ai des problèmes de quote de porc avec bash et je vais vous illustrer ça dans 2 endroits du code :: ## Les entrées pareilles, pas pareilles [ici](https://gist.github.com/jul/ef4cbc4f506caace73c3c38b91cb1ea2#file-mr_freeze-sh-L194) Vous voyez le code commenté ? ``` if [[ "$( echo $FROM | cat - )" != "$( echo $ACTUAL | cat - )" ]]; then #if diff -q <( echo $FROM ) <( echo $ACTUAL ); then #if [[ "$FROM" != "$ACTUAL" ]]; then ``` Et ben, il môrche pô. En fait un _od -a_ au cul de _du_ nous apprends que la sortie réelle contient une tabulation, mais dans le mystère des pipes et echo il est transformé en espace. Donc je normalise les sorties en faisant un _echo_ et un _pipe_ par _cat -_ qui est en fait l'identité. Qui a dit que ce que j'ai fait été porcasse ? :D Osef, ça marche. ## et je t'embrouille ni vu ni connu sur la récupération des arguments de la CLI avec des espaces ``` ARG=() for v in A B C D E F G H; do eval $v=\"1ドル\"; ARG+=("1ドル") shift done ``` Alors je dois mapper les arguments de la ligne de commande à coup d'éval de 3ドル ... 10ドル à $A ... $H car j'ai structuré mon code en fonction (voir plus tard) et dans les fonction 3ドル ... 10ドル sont masqués. Tiens, au passage je colle ça dans un tableau (l'une des rares basheries qui est nécessaire à « programmer » facilement au même titre que les tableaux associatifs). Et je le réutilise plus tard avec cette fumisterie de ``` echo "✅ [replay_${INPUT}] created use [0ドル thaw \"replay_$INPUT\" $( map quote "${ARG[@]}" )] to replay" ``` Où la magie n'est ni dans quote, ni dans map, mais dans "${ARG[@]}" Je vous montre au passage map et quote ``` map() { f=1ドル; shift while [ -n "1ドル" ]; do eval "$f" "1ドル" shift done } quote() { echo -n " \"$@\""; } ``` et non `map quote $*` en top level ne donne pas le résultat attendu, et je sais vraiment pas pourquoi. # Format « libexec » Il est en C des objets comme curl qui selon qu'on l'appelle comme un code devient un executable, mais sinon est une librairie avec le même binaire. Là j'ai tenté de reproduire le comportement avec une détection de sourçage pour faire un return 1 et éviter l'expérience désagréable du terminal qui quitte quand on source :) et sinon appeler les fonctions idoines avec les arguments passés. Ainsi : ``` ./mr_freeze.sh thaw "replay_input" "a*" "petiot" ``` est équivalent à ``` source ./mr_freeze.sh thaw "replay_input" "a*" "petiot" ``` Et ainsi on peut utiliser le code comme un script et comme une librairie (même si je pollue un peu pas mal beaucoup le namespace).

AltStyle によって変換されたページ (->オリジナル) /