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

Résolu/Fermé
BillyV33 - 7 avril 2019 à 17:10
 BillyV33 - 11 avril 2019 à 03:57
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
A voir également:

3 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
7 avril 2019 à 19:42
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
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
lEprofSonDkon Messages postés 211 Date d'inscription jeudi 13 décembre 2018 Statut Membre Dernière intervention 8 octobre 2022 13
7 avril 2019 à 19:47
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
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
lEprofSonDkon Messages postés 211 Date d'inscription jeudi 13 décembre 2018 Statut Membre Dernière intervention 8 octobre 2022 13 > BillyV33
8 avril 2019 à 03:48
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
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
lEprofSonDkon Messages postés 211 Date d'inscription jeudi 13 décembre 2018 Statut Membre Dernière intervention 8 octobre 2022 13 > BillyV33
Modifié le 8 avril 2019 à 15:13
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
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