bloquer/vider stdin
Le
Benoit Izac

Bonjour,
Soit ce petit script pour faire le ménage dans des documents pdf :
#!/bin/sh
for f in *.pdf; do
xpdf "$f"
printf "delete $f? "
read d
case $d in
"y"|"Y") rm -- "$f" ;;
esac
done
Le problème est que de temps en temps, je tape « q » pour quitter xpdf
mais le focus est sur la fenêtre shell dans laquelle j'ai lancé le
script. Du coup « read d » prend ce « q » et le case fait pas ce que je
souhaite.
Comment faire pour vider stdin avant le « printf "delete $f? " » ?
Comment bloquer l'entrée standard pendant le « xpdf "$f" » ?
--
Benoit Izac
Soit ce petit script pour faire le ménage dans des documents pdf :
#!/bin/sh
for f in *.pdf; do
xpdf "$f"
printf "delete $f? "
read d
case $d in
"y"|"Y") rm -- "$f" ;;
esac
done
Le problème est que de temps en temps, je tape « q » pour quitter xpdf
mais le focus est sur la fenêtre shell dans laquelle j'ai lancé le
script. Du coup « read d » prend ce « q » et le case fait pas ce que je
souhaite.
Comment faire pour vider stdin avant le « printf "delete $f? " » ?
Comment bloquer l'entrée standard pendant le « xpdf "$f" » ?
--
Benoit Izac
Déjà, un contournement serait de faire une boucle imbriquée, qui repose
la question tant que la réponse est différente de "y"|"Y" (réponses
positives) et de ""|"n"|"N" (réponses négatives, un simple RETURN
suffisant à passer à la suite).
C'est probablement de ce côté qu'il faut chercher, si le contournement
ne te convient pas.
Je ne pense pas que ce soit possible ou souhaitable.
le 15/10/2007 à 12:12, Olivier Miakinen a écrit dans le message
Exact, mais si je pose la question, c'est plus pour assouvir ma
curiosité qu'un réel besoin.
Avec un petit programme en C et O_NONBLOCK, je pense que ça doit se
faire. Mais je souhaiterais trouver une solution plus réutilisable.
Je pensais que je pourrais le faire avec stty mais je n'ai pas réussi.
--
Benoit Izac
Je suis aussi intéressé par la solution, si elle existe. En gros il
faudrait pouvoir faire un read non bloquant (et boucler dessus tant
qu'il y a des choses à lire).