Script sh qui reçoit le STDOUT d'une commende suite à un PIPE du terminal

Résolu
BillyV33 -  
 BillyV33 -
Bonjour à toutes et à tous,

J'ai déjà posé une question auparavant et ça était vraiment instructif!
Donc, me revoilà!
Dans mon script j’ai autres choses à faire mais le reste fonctionne.

Où j'ai un problème c'est ici:

J'ai un fichier qui contient : 30 31 37 20 41 41 41 20 0A
Avec la cmd hexdump je reçois :

$ hexdump fichier
0000000 3033 3320 2031 3733 3220 2030 3134 3420
0000010 2031 3134 3220 2030 4130 000a
000001b

je lance mon script .sh de cette façon:
$ hexdump fichier | ./hex2c -h -

et mon résultat devrait être :
30 31 37 20 41 41 41 20 0A

finalement, le but est de faire un retour en arrière!

Voici mon bout de code :
if [ "$1" = "-h" ] && [ "$2" = "-" ]; then
read TEXT;
i=0;
for ligne in $TEXT; do
i=$(($i + 1)); #test pour vérifier s'il lit des lignes...
xxd -r 2> /dev/null;
echo "$i $ligne";
done
fi

Mais je ne sais pas pourquoi il transforme juste une partie du code reçu
J'ai essayé avec un code plus simple sans boucle for, avec REPLY, avec $@, $*.... d'autres boucles ...
mais toujours le même résultat!
J'ai testé avec l'appel au fichier directement via la cmd hexdump dans mon script et ça traduit le tout mais une paire de chiffres sur deux est écrit à l'envers mais au moins ils sont tous là! mais via la réception du STDOUT rien à faire! POURQUOI????

là! je suis complètement perdue.. je ne comprend pas le mécanisme!!
C'est mon premier script en sh! :)

Merci beaucoup

Configuration: Linux / Firefox 60.0

3 réponses

  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,
    C'est mon premier script en sh
    Attention à l'abus de langage en shell sous GNU/Linux ;-\

    sh ≠ bash
    ;-\

    Quelle distribution utilises-tu ?
    Quel est ton shell ?
    Quel shebang emploies-tu pour ton script ?

    Pour info, sous Debian, Ubuntu et dérivés,
    /bin/sh
    est un lien symbolique vers
    /bin/dash
    .

    $ readlink -f /bin/sh
    /bin/dash

    0
    1. BillyV33
       
      bonjour sipe31

      Merci pour la précision :)
      effectivement, je suis sous Debian 9 Stretch et mon Shell

      billy@debian:~$ echo $SHELL
      /bin/bash

      billy@debian:~$ cat /etc/shells
      # /etc/shells: valid login shells
      /bin/sh
      /bin/dash
      /bin/bash
      /bin/rbash
      /usr/bin/screen

      billy@debian:~$ readlink -f /bin/sh
      /bin/dash

      Mon shebang est /bin/sh

      Merci
      .
      0
  2. lEprofSonDkon Messages postés 227 Statut Membre 13
     
    salut,

    read
    ne lit qu'une ligne.
    for
    ne lit pas des lignes, mais des mots.
    xxd
    ne reçoit aucune donnée à lire.

    pourquoi ne pas utiliser
    xxd
    dans les deux sens (conversion/reconversion) ?
    0
    1. BillyV33
       
      bonjour IEprofSonDkon

      Oulàlà! je suis loin de la solution!!
      merci pour les explications ,et pour le hexdump on est obligé de l'utiliser tel que mentionné
      $ hexdump fichier | ./hex2c -h -
      Mais comment ont fait alors pour envoyer au script le résultat d'une commande pour qu'il puisse le lire et le traiter?
      Pourtant quad je demande de lire $ligne il lit bien ce qui reçu non?

      merci !!!
      0
      1. lEprofSonDkon Messages postés 227 Statut Membre 13 > BillyV33
         
        read
        lit une ligne; une seule.
        pour lire plusieurs lignes, il faut lire tant qu'on peut ;)
        while read line; do echo "$line"; done


        la sortie de hexdump comporte deux types de colonnes sur chaque ligne :
        la première affiche la position du premier caractère de la ligne en cours (de l'affichage, pas du fichier)
        les colonnes suivantes, elles affichent les caractères du fichier.

        il faut donc traiter différemment ces deux types de colonnes.
        comme tu l'as remarqué, les données des "colonnes caractères" sont inversées.
        la première peut être affichée telle quelle, alors que la deuxième doit voir ces composantes inversées, deux par deux.
        par exemple,
        3033
        doit devenir
        3330
        , pour que
        xxd
        retourne
        30
        .

        dash
        ne sait pas faire ça tout seul, ou simplement avec des commandes externes (typiquement les commandes de
        coreutils
        ).

        dash
        est une obligation ?
        0
    2. BillyV33
       
      Bonsoir IEprofSonDkon
      WOW! je vais regarder le tout avec beaucoup d’intérêt demain PM.
      il est 23h chez moi et demain je travail très tôt

      mais ce qui est obligatoire c'est soit on utilise #!/bin/sh soit #!/bin/bash mais 'a priori on devrait plus utiliser le sh
      mais je peux le faire en bash mais je dois m'assurer que tout mon script fonctionne ... il n'est pas long! :)

      encore merci beaucoup!!
      0
      1. lEprofSonDkon Messages postés 227 Statut Membre 13 > BillyV33
         
        comme le suggère mon pseudo, je ne suis pas convaincu que les personnes qui donnent des exercices de codage shell connaissent elles-mêmes les subtilités d'appel à
        /bin/sh
        ...
        entre autre.
        0
  3. BillyV33
     
    bonsoir IEprofSonDkon
    enfin de retour! j'ai beaucoup réfléchi sur tout ce que tu m'as donné et j'ai trouvé la solution !

    la voilà

    #--------------------------------------------------------------------------------------------
    #MODE HEXDUMP $ hexdump fichier.txt | ./hex2c.sh -h -
    #--------------------------------------------------------------------------------------------
    .......c'est la suite de mon script.sh

    elif [ "$1" = "-h" -a "$2" = "-" ]; then

    # echo "conversion arriere avec xxd -ps -r: ";

    ligne=$(sed -E "s/ /: /g;s/ (..)(..)/ \2\1/g" | cut -c10- | xxd -ps -r)

    echo "$ligne";

    .....

    Substitution de commandes pour exécuter une commande et enregistrer son résultat dans une variable:
    ligne=$(sed -E "s/ /: /g;s/ (..)(..)/ \2\1/g" | cut -c10- | xxd -ps -r)
    --------------------------------------------------------------------------------------------
    Reçoit:
    $ hexdump fichier.txt
    0000000 3033 3320 2031 3733 3220 2030 3134 3420
    0000010 2031 3134 3220 2030 4130 000a
    000001b

    Explication cmd sed:
    remplace les <espaces> par des <:espace> pour tout.
    je concatène une deuxième commande sed qui
    inverse la position de chaque groupe de paire de caractères avec <espace(gr2)(gr1)
    cut -c10- prend tout ce qui vient a partir du 10eme caractère jusqu’à la fin et
    xxd -ps -r fait la conversion inverse de ce qui a reçu du format hexdump fichier.txt

    Affiche:
    30 31 37 20 41 41 41 20 0A (qui est le contenu du fichier.txt avant la conversion avec hexdump)
    --------------------------------------------------------------------------------------------

    Encore merci infiniment pour aide! ça été dur mais j'y suis arrivé! :):)
    je vais sûrement revenir bientôt pour d'autres questions !

    bonne soirée!!!
    0