Votre navigateur est obsolète. Téléchargez un navigateur moderne, par exemple FireFox.
Léa-Linux : Forum
Le forum de Léa abrite des discussions autour des Logiciels libres.
Syndication
  • RSS ForumForum complet
  • RSS Forum - DéveloppementForum - Développement
  • RSS Forum - Développement - 336014Cette discussion

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.

Important : quand vous posez une question, n'oubliez pas de nous donner les indications suffisantes pour que nous puissions répondre. En effet, la divination n'est pas le fort du Linuxien averti. Pour une meilleure compréhension, le bon usage de la grammaire et de l'orthographe est fortement encouragé. En particulier, le langage SMS est à éviter absolument. En cas d'abus, il pourra être censuré sans autre forme de procès.
Les messages dont le contenu est illégal (incitant à la haine - raciale ou autre, diffamant), ou dont le contenu est sans rapport avec le sujet du forum, ou qui sont parfaitement stupides ou hors sujet seront supprimés sans pitié. Il pourra même être fait appel au fournisseur d'accès du coupable pour faire cesser ses agissements.
» Index du forum » Développement » [ksh] read imbriqués
Aller à la discussion: PrécédentSuivante
Action: Nouveau sujetChercherS'authentifier
[ksh] read imbriqués
Auteur: cancerus (IP enregistrée)
Date: le 10 avril 2008 à 11:33

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 ? image : content

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


Re: [ksh] read imbriqués
Auteur: Blini (IP enregistrée)
Date: le 10 avril 2008 à 16:57

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


Re: [ksh] read imbriqués
Auteur: pgas (IP enregistrée)
Date: le 11 avril 2008 à 09:32


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

Re: [ksh] read imbriqués
Auteur: cancerus (IP enregistrée)
Date: le 14 avril 2008 à 16:05

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.

Re: [ksh] read imbriqués
Avatar
Auteur: Sve@r (IP enregistrée)
Date: le 15 avril 2008 à 11:57

cancerus a écrit :

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]



Nom du forum : (antispam) - (en développement:saisir un texte pour le message, rempli cette zone automatiquement)
Votre nom: 
Votre email: 
Sujet: 

 
Ce forum est boosté par Phorum.