Journal mr_freeze.sh un utilitaire de capture de commandes paramétrée

Posté par  (site web personnel) . Licence CC By‑SA.
Étiquettes :
3
9
nov.
2025

Sommaire

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
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
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).

  • # Disciple de Mallarmé ?

    Posté par  (site web personnel) . Évalué à 2 (+0/-0).

    Tout est dans le titre.

    « IRAFURORBREVISESTANIMUMREGEQUINISIPARETIMPERAT » — Odes — Horace

  • # développement de variable

    Posté par  . Évalué à 7 (+6/-0). Dernière modification le 10 novembre 2025 à 07:44.

    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.

    C'est le comportement normal de bash (voir le paragraphe "DÉVELOPPEMENTS" dans la page de man). Le développement en mots n'est pas fait si la variable est entre double quotes

        $ du -sh /usr/sbin
        74M     /usr/sbin
        $ PLOUF=$(du -sh /usr/sbin)
        $ echo ${PLOUF}
        74M /usr/sbin
        $ echo "${PLOUF}"
        74M     /usr/sbin
    • [^] # Re: développement de variable

      Posté par  . Évalué à 3 (+2/-0). Dernière modification le 10 novembre 2025 à 07:45.

      argh, le formatage a mangé les espaces (et le commentaire n'est plus modifiable)

      NdM: commentaires édités pour la coloration syntaxique bash

      • [^] # Re: développement de variable

        Posté par  (site web personnel) . Évalué à 4 (+2/-0). Dernière modification le 10 novembre 2025 à 13:12.

        NdM: commentaires édités pour la coloration syntaxique bash

        oui ça fonctionne le formatage Markdown avec ```bash histoire de rajouter la coloration syntaxique du code, l'utilisation des 4 espaces en début de ligne est généralement buggué pour moi :/

        Merci gUI< _o/

      • [^] # coloration code ici

        Posté par  (site web personnel, Mastodon) . Évalué à 5 (+3/-0).

        NdM: commentaires édités pour la coloration syntaxique bash

        J’en profite pour signaler l’existence de la coloration syntaxique diff, vu que le journal le demandait :

        Et en plus, j'ai pas la couleur en markdown, mais sinon la sortie du diff est colorée

        Ce n’est pas lié à markdown et cela donne :

        👌 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

        “It is seldom that liberty of any kind is lost all at once.” ― David Hume

    • [^] # Re: développement de variable

      Posté par  (site web personnel) . Évalué à 3 (+2/-0).

      merci, je vais voir si entre les fonctions inutiles j'ai pas oublié de "" une variable.

      N'empêche que j'en apprends tous les jours, même en contournant le problème comme un … ostrogoth.

      J'ai codé ça entre 2 sorties de mes femmes et j'ai peut être manqué un peu d'attention.

      Ça fait du sens cette pratique de toujours double quotté les vars que je fais mécaniquement sans me souvenir pourquoi :D

      ben vi, les bases. Faut les réviser souvent.

      • [^] # Re: développement de variable

        Posté par  (site web personnel, Mastodon) . Évalué à 3 (+2/-0). Dernière modification le 11 novembre 2025 à 16:54.

        Faut les réviser souvent.

        Ou utiliser un langage moins…, enfin plus…

        Pourquoi l'as tu écris en Bash au lieu de Python ou d'un autre plus simple? Peut-être pour le fun. Parce que sinon, techniquement, pour moi, Bash n'a pas d'intérêt pour écrire un programme… Sauf si c'est simple ou (Genre lancer des commandes) ou qu'il faut que ça marche partout sans compilation en déposant.

        Sous licence Creative common. Lisez, copiez, modifiez faites en ce que vous voulez.

        • [^] # Re: développement de variable

          Posté par  (site web personnel) . Évalué à 4 (+3/-0).

          C'est qu'en milieu pro, je me suis aperçu que sur linux/windows, dès que j'ai git installé, j'ai forcément, git, bash, perl, cut …

          Et c'est un peu devenu ma stack standard de devops…

          Je tente parfois la portabilité linux/windows pour le fun.

          • [^] # Re: développement de variable

            Posté par  (site web personnel, Mastodon) . Évalué à 2 (+1/-0).

            Perl est beaucoup mieux que Bash pour un soft un peu sophistiqué, je trouve.

            Et je doute qu'il n'y ait pas Python, même sur Windows (S'il y a langage multi-os c'est bien lui - en non compilé). Alors que Bash, sous Windows? Sous Windows c'est PowerShell à moins d'être en WSL (i.e. Ubuntu). Je n'ai jamais vu Bash & Cie sous Windows or Cygwin. Bon je l'admet, cela fait un baille que je ne touche plus trop à Windows… ou alors de manière basique (Genre en PC de travail en entreprise sur lequel on ne touche pas) et encore, cela fait plus de 2,5 ans.

            Sous licence Creative common. Lisez, copiez, modifiez faites en ce que vous voulez.

  • # utilisation en framework bash

    Posté par  (site web personnel) . Évalué à 1 (+0/-0).

    Peut s'utiliser en librairie shell comme suit:

    . ./mr_freeze.sh 
    

    ensuite :

    A=badass freeze input 
    

    Ce qui donne :

    ✍️ recording: uname -a #immutable
    ✍️ recording: [ -n "$PROD" ] && echo "ok" || echo "ko" # mutable according to env variable
    ✍️ recording: echo ${B:-$(date)} # mutable or not
    ✍️ recording: slmdkfmlsfs # immutable
    ✍️ recording: du -sh #immutable (kof kof)
    ✍️ recording: ssh "$A"  'uname -a'
    ✅ [input] recorded. Use [bash thaw "replay_input" ] to replay
    A=petiot thaw replay_input 
    

    donnant :

    👌 uname -a #immutable
    👌 [ -n "$PROD" ] && echo "ok" || echo "ko" # mutable according to env variable
    🔥 echo ${B:-$(date)} # mutable or not 
    @@ -1 +1 @@
    -mar. 11 nov. 2025 14:20:07 CET
    +mar. 11 nov. 2025 14:20:12 CET
    👌 slmdkfmlsfs # immutable
    👌 du -sh #immutable (kof kof)
    🔥 ssh "$A"  '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
    $ A=petiot B=1 thaw replay_input
    👌 uname -a #immutable
    👌 [ -n "$PROD" ] && echo "ok" || echo "ko" # mutable according to env variable
    🔥 echo ${B:-$(date)} # mutable or not 
    @@ -1 +1 @@
    -mar. 11 nov. 2025 14:20:07 CET
    +1
    👌 slmdkfmlsfs # immutable
    👌 du -sh #immutable (kof kof)
    🔥 ssh "$A"  '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

    Maintenant il serait bien que je m'y colle sérieusement et positionne le return pour que ces fonctions retournent un code de réussite/erreurs

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.