Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
[ksh] read imbriqués
Envoyé par: cancerus

Bonjour,

Voici ma problèmatique :

Je parcours un fichier contenant des noms de fichiers d'où:
cat $fichier | while read ma_variable

Pour chaque nom de fichiers trouvés dans mon fichier, je demande qu'elle est l'action à faire doù l'utilisation de read puisque l'utilisateur a plusieurs choix.

Sauf que le second read est alimenté automatiquement par le premier... donc je me retrouve avec un contenu dans la variable sensée être alimentée par le second read alors que l'utilisateur ne rentre rien et le contenu corrrespond au premier read... Je suis assez clair ? :-)

Quelqu'un aurait-il une solution pour remédier à ce problème ?
D'avance merci.


Poste le Thursday 10 April 2008 11:33:26
Répondre     Citer    
Re: [ksh] read imbriqués
Envoyé par: Blini

Salut,

Àmha c'est impossible car stdin est occupé par la sortie du tube (d'où pas de clavier), or c'est ce que lit read par défaut.

Si tu veux faire ça, arrange-toi pour laisser stdin libre en ouvrant le descripteur lu par read directement sur le fichier.


while read A <$fichier; do
    read B
    echo "réponse pour le fichier '$A' : '$B'."
done

Poste le Thursday 10 April 2008 16:57:39
Répondre     Citer    
Re: [ksh] read imbriqués
Envoyé par: pgas


while read -r var <&3;do
read var2
echo "var: $var var2: $var2"
done 3< "$fichier"

''3< "$ficher" '' ouvre le descripteur 3 sur le fichier en lecture, stdin rest ouvert sur le terminal

''read -r var <&3 '' fait que ce read lit le descripteur 3 plutot que stdin

Poste le Friday 11 April 2008 09:32:54
Répondre     Citer    
Re: [ksh] read imbriqués
Envoyé par: cancerus

Hello pgas,

Merci. J'essaierai de mettre ta technique en pratique dès que possible.

Pour me sortir de mon problème, j'ai utilisé la commande:
for TOTO in `cat MonFichier`

Bon, j'avoue, c'est moins pratique car il ne faut pas qu'il y ait d'espace dans la ligne en cours de lecture. S'il y a un espace, le cat considère qu'il s'agît d'un autre enregistrement.

En tous cas, merci pgas, je te tiens au courant si j'arrive à prendre 5 minutes pour mettre en place ta solution.

Bonne fin d'après-midi.

Poste le Monday 14 April 2008 16:05:14
Répondre     Citer    
Re: [ksh] read imbriqués
Envoyé par: Sve@r

Citation
cancerus
Hello pgas,

Merci. J'essaierai de mettre ta technique en
pratique dès que possible.

Pour me sortir de mon problème, j'ai utilisé la
commande:
for TOTO in `cat MonFichier`

Bon, j'avoue, c'est moins pratique car il ne faut
pas qu'il y ait d'espace dans la ligne en cours de
lecture. S'il y a un espace, le cat considère
qu'il s'agît d'un autre enregistrement.

En tous cas, merci pgas, je te tiens au courant si
j'arrive à prendre 5 minutes pour mettre en place
ta solution.

Bonne fin d'après-midi.

T'as effectivement compris que ton for ne marcherait que s'il n'y avait pas d'espace.
Cependant j'ai une meilleure solution à te proposer: utiliser un buffer personnel

Il te suffit de taper "exec 3<fichier" et tout ton fichier est stocké dans le buffer n° 3

Ensuite tu n'as plus qu'à lire le buffer n° 3 pour lire le fichier et lire classiquement le clavier pour faire saisir ton choix

Exemple
#!/bin/sh

# Stockage du fichier dans le canal 3
exec 3<MonFichier

# Lecture du canal 3
while read ligne 0<&3
do
    echo "$ligne"
    echo "Quel est votre choix"
    read choix
    echo "Votre choix est $choix
done

En plus tu peux même lire en parallèle plusieurs fichiers en utilisant plusieurs canaux (limite 64 je crois) et je n'ai pas encore découvert de limite à la taille du fichier (j'ai testé sur des fichiers dépassant 1Go)


L'homme qui murmurait à l'oreille des pingouins
[fr.lang.free.fr]

Poste le Tuesday 15 April 2008 11:57:04
Répondre     Citer    
Re: [ksh] read imbriqués
Envoyé par: jlseach

Blini a écrit:
-------------------------------------------------------
> Salut,
>
> Àmha c'est impossible car stdin est occupé par
> la sortie du tube (d'où pas de clavier), or c'est
> ce que lit read par défaut.
>
> Si tu veux faire ça, arrange-toi pour laisser
> stdin libre en ouvrant le descripteur lu par read
> directement sur le fichier.
>
>
> while read A <$fichier; do
> read B
> echo "réponse pour le fichier '$A' : '$B'."
> done
>

Le truc bizarre c'est que l'instruction continue ne fonctionne plus alors en ksh AIX.
Bizarre.

Poste le Friday 6 January 2012 09:32:24
Répondre     Citer    
Re: [ksh] read imbriqués
Envoyé par: jlseach

jlseach a écrit:
-------------------------------------------------------
> Blini a écrit:
> --------------------------------------------------
> -----
> > Salut,
> >
> > Àmha c'est impossible car stdin est occupé
> par
> > la sortie du tube (d'où pas de clavier), or
> c'est
> > ce que lit read par défaut.
> >
> > Si tu veux faire ça, arrange-toi pour laisser
> > stdin libre en ouvrant le descripteur lu par
> read
> > directement sur le fichier.
> >
> >
> > while read A <$fichier; do
> > read B
> > echo "réponse pour le fichier '$A' :
> '$B'."
> > done
> >
>
> Le truc bizarre c'est que l'instruction continue
> ne fonctionne plus alors en ksh AIX.
> Bizarre.

Ah mais ça marche avec le <&3

trop fort

encore merci.

Poste le Friday 6 January 2012 09:45:02
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
[ksh] read imbriqués
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons