Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 01/09/2021, à 15:56

Hizoka

[Résolu] commande read avec pipe

Salut à tous smile

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 smile

Dernière modification par Hizoka (Le 01/09/2021, à 21:29)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#2 Le 01/09/2021, à 16: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.

En ligne

#3 Le 01/09/2021, à 16: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, à 16:50)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#4 Le 01/09/2021, à 18: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.

En ligne

#5 Le 01/09/2021, à 18: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, à 19: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.

En ligne

#7 Le 01/09/2021, à 20: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, à 21: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. smile

Dernière modification par Watael (Le 01/09/2021, à 21:08)


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#9 Le 01/09/2021, à 21: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 smile
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, à 23: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, à 09: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, à 10:20

kamaris

Re : [Résolu] commande read avec pipe

Ah ben oui, forcément big_smile
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, à 10:43

Hizoka

Re : [Résolu] commande read avec pipe

Et ouais, c'est ça qui est pas facile wink

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 smile


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne