Script sh qui reçoit le STDOUT d'une commende suite à un PIPE du terminal
Résolu
BillyV33
-
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
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:
- Script sh qui reçoit le STDOUT d'une commende suite à un PIPE du terminal
- Commande terminal mac - Guide
- Script vidéo youtube - Guide
- Recoit on les messages apres avoir débloqué un contact ✓ - Forum iPhone
- Fichier .sh - Forum Ubuntu
- Fichier sh - Forum Shell
3 réponses
Salut,
Quelle distribution utilises-tu ?
Quel est ton shell ?
Quel shebang emploies-tu pour ton script ?
Pour info, sous Debian, Ubuntu et dérivés,
C'est mon premier script en shAttention à 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/shest un lien symbolique vers
/bin/dash.
$ readlink -f /bin/sh
/bin/dash
salut,
pourquoi ne pas utiliser
readne lit qu'une ligne.
forne lit pas des lignes, mais des mots.
xxdne reçoit aucune donnée à lire.
pourquoi ne pas utiliser
xxddans les deux sens (conversion/reconversion) ?
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 !!!
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 !!!
readlit 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,
3033doit devenir
3330, pour que
xxdretourne
30.
dashne sait pas faire ça tout seul, ou simplement avec des commandes externes (typiquement les commandes de
coreutils).
dashest une obligation ?
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!!
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!!
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!!!
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!!!
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
.