#1 Le 01/09/2021, à 14:56
- Hizoka
[Résolu] commande read avec pipe
Salut à tous
J'ai un soft dans lequel je surveille les touches pressées via une boucle de type :
# Vous pouvez tester, ça fonctionne bien
while IFS='' read -r -u 2 -sn 1 Touche
do
case "$Touche" in
# ...
$'\033')
# Permet de savoir s'il y a un autre caractère qui suit, si ce n'est pas le cas, c'est qu'on a utilisé la touche échap
read -t 0
if (( ${?} ))
then
echo "touche échap"
break
else
echo "autre touche spéciale"
fi
# ...
esac
done
Elle fonctionne très bien ainsi, il reconnait bien les différentes touches dont j'ai besoin.
La touche echap permet de quitter la boucle.
Le souci, c'est des que je veux lire les données de stdin dans mon script via un pipe ou une redirection :
echo blabla | hizoselect
hizoselect < <(echo blabla)
A ce moment là, il n'arrive plus a différentier la touche spéciale echap des autres touches spéciales (flèches, page, début, fin...).
Et ce que j'utilise ou non stdin... ex :
# Si vous testez, vous verrez qu'il ne fait plus de différence
true | while IFS='' read -r -u 2 -sn 1 Touche
do
case "$Touche" in
# ...
$'\033')
read -t 0
if (( ${?} ))
then
echo "touche échap"
break
else
echo "autre touche spéciale"
fi
# ...
esac
done
while IFS='' read -r -u 2 -sn 1 Touche
do
case "$Touche" in
# ...
$'\033')
read -t 0
if (( ${?} ))
then
echo "touche échap"
break
else
echo "autre touche spéciale"
fi
# ...
esac
done < <(true)
J'ai testé quelques trucs mais je ne vois pas trop comment faire...
Auriez vous une idée de comment contourner le problème ?
Merci
Dernière modification par Hizoka (Le 01/09/2021, à 20:29)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#2 Le 01/09/2021, à 15:33
- Watael
Re : [Résolu] commande read avec pipe
salut,
ça fonctionne aussi peu quand on lit un fichier avec ce type de boucle.
sur le(s) read suivant(s), il faut rediriger le TTY courant :
tty=$(tty)
read -r data < $tty
peux-tu nous rappeler pourquoi -u 2 ?
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#3 Le 01/09/2021, à 15:40
- Hizoka
Re : [Résolu] commande read avec pipe
alors :
tty me renvoie : pas un tty, ca ne fonctionne donc pas.
EDIT : j'ai le droit à ce message dès qu'il y a un pipe lié au script.
cat test.sh
#!/bin/bash
tty=$(tty)
while IFS='' read -r -u 2 -sn 1 Touche
do
case "$Touche" in
$'\033')
read -t 0 < $tty
if (( ${?} ))
then
echo "touche échap"
break
else
echo "autre touche spéciale"
fi
esac
done
Si je lance le script, ça fonctionne bien.
Si je fais un pipe, j'ai le message lié au tty.
sans le -u 2, avec un pipe, la boucle se termine aussitôt.
Avec, tout fonctionne bien sauf la fameuse touche echap...
Dernière modification par Hizoka (Le 01/09/2021, à 15:50)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#4 Le 01/09/2021, à 17:39
- Watael
Re : [Résolu] commande read avec pipe
"pas un tty", comment exécutes-tu ce script ?
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#5 Le 01/09/2021, à 17:52
- Hizoka
Re : [Résolu] commande read avec pipe
J'ai ajouté echo "tty : $tty" apres tty=$(tty) :
echo "" | ./test.sh
tty : pas un tty
./test.sh <<< "oui"
tty : pas un tty
bash test.sh <<< "oui"
tty : pas un tty
bash test.sh < <(echo "")
tty : pas un tty
./test.sh < <(true)
tty : pas un tty
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#6 Le 01/09/2021, à 18:19
- Watael
Re : [Résolu] commande read avec pipe
silly me!
lis "l'input" avant d'entrer dans la boucle, parce que dans la boucle, c'est trop tard.
ce n'est pas comme si tu voulais lire des données pendant la lecture en boucle !
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#7 Le 01/09/2021, à 19:40
- Hizoka
Re : [Résolu] commande read avec pipe
Je comprends pas...
la boucle surveille chaque pression de touche.
elle continue tant que je ne l'arrête pas.
De ce fait, j'ai besoin de lire les données en directe dans la boucle...
Le cas des touches spéciales est spécifique, ça renvoie $'\033' puis d'autres dans le cas ou la touche n'est pas échap.
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#8 Le 01/09/2021, à 20:00
- Watael
Re : [Résolu] commande read avec pipe
si tu as besoin de lire des données dans le corps de la boucle, tu ne peux pas faire un pipe; c'est contradictoire.
edit: il faudrait que tut précises précisément ton besoin.
Dernière modification par Watael (Le 01/09/2021, à 20:08)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#9 Le 01/09/2021, à 20:29
- Hizoka
Re : [Résolu] commande read avec pipe
C'est mon soft hizoselect : https://forum.ubuntu-fr.org/viewtopic.php?id=2013570 (la page est plus trop à jour mais le ppa l'est).
L'idée est de créer un select bien plus poussé que la commande de base.
Il permet plein de trucs et plein d'actions avant validation de celles-ci.
1ere étape, je récupère la liste des réponses possibles soit via la commande (select a b c) ou via un pipe (et c'est la que ça complique tout).
2e etape, je les affiche et je lance la boucle qui va surveiller ce que je fais pour autoriser ou non les actions demandées.
Et c'est justement ça qui m'étonne, c'est que le pipe est utilisé hors de la boucle mais que cela a un effet sur celle-ci (et uniquement pour ces satanées touches spécifiques qui sont interdites sauf échap).
Tout se passe sur read -t 0 qui renvoie 1 lorsque je n'utilise pas de pipe pour la touche echap (contrairement aux autres touches).
Mais elle renvoie 0 quand il y a un pipe ou redirection...
Et c'est là que je comprends le problème
en rajoutant tout simple -u 2 à ce fameux read -t 0, ça fonctionne...
Je viens de tilter que je ne l'avais pas indiqué contrairement à d'autres read...
Merci beaucoup pour ton temps Watael !
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#10 Le 02/09/2021, à 22:27
- kamaris
Re : [Résolu] commande read avec pipe
Je pense qu'il vaudrait mieux mettre un
exec 3<&0
avant la boucle, et lire sur le descripteur 3, plutôt qu'utiliser 2.
Si des choses vont sur la sortie d'erreur, il pourrait y avoir confusion…
Hors ligne
#11 Le 03/09/2021, à 08:46
- Hizoka
Re : [Résolu] commande read avec pipe
Salut Karamis, tu proposes ?
exec 3<&0
while IFS='' read -r -u 3 -sn 1 Touche
Ca ne fonctionne pas, la boucle se termine aussitot.
#!/bin/bash
exec 3<&0
# Boucle attendant qu'on entre une valeur au clavier
# le -u 3 est essentiel pour les données en provenance de pipe ne posent pas problème
while IFS='' read -r -u 3 -sn 1 Touche
do
echo "Touche : $Touche"
done
bash test.sh
Touche :
ouche : [
Touche : A
Touche : d
Touche : a
Touche :
ouche : [
Touche : D
printf "oui" | bash test.sh
Touche : o
Touche : u
Touche : i
Dés que stdin contient quelque chose, il est lu par la boucle qui se termine.
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#12 Le 03/09/2021, à 09:20
- kamaris
Re : [Résolu] commande read avec pipe
Ah ben oui, forcément
Je pensais que tu voulais simplement libérer l'entrée standard de la boucle, pas celle du script.
Donc ça marche avec les exemples que tu donnais au début, mais si tu envoies des choses sur l'entrée standard du script, ça les envoie sur le descripteur 3 qui est sa duplication.
Hors ligne
#13 Le 03/09/2021, à 09:43
- Hizoka
Re : [Résolu] commande read avec pipe
Et ouais, c'est ça qui est pas facile
au final, le pipe n'a aucun rapport avec la boucle.
Je le lis avant toute action avec la boucle.
Comme tu l'as compris, c'est en lien avec l'autre topic.
En tout cas merci pour tes propositions
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne