IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Double read avec pipe


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 44
    Par défaut Double read avec pipe
    Bonjour à tous, j'ai un petit soucis
    Je n'arrive pas à faire un nouveau read dans un pipe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    cat toto|while read LINE
    do
      echo "$LINE"
      echo "Voulez vous changer la valeur ?"
      read R
    done
    Le read R ne donne jamais la main, je suppose que c'est à cause du pipe qui possède déjà le flux stdin, mais alors comment saisir une valeur ?

    cdt,
    dosy07

  2. #2
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Bonjour,

    La commande read utilise stdin pour lire chaque ligne du fichier mais aussi pour lire les entrées de l'utilisateur. En exécutant ton code, je vois que les entrées qui devraient m'être demandées sont en fait remplies par les lignes du fichier.

    Pour réussir ce que tu veux faire, il faut éviter d'utiliser deux commandes read dans une boucle puisqu'elles se nourrissent uniquement du fichier. Je lirais le fichier dans une variable, s'il n'est pas trop gros, l'utiliserais dans une boucle for, et prendrais les entrées de l'utilisateur par read.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/bash
     
    rm -f toto.new
    lineList=$(cat toto)
    for line in $lineList
    do
      echo -n "Valeur courante: $line, nouvelle valeur: "
      read newLine
      echo ${newLine:-$line} >> toto.new
    done

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par dosy07 Voir le message
    Bonjour à tous, j'ai un petit soucis
    Je n'arrive pas à faire un nouveau read dans un pipe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    cat toto|while read LINE
    do
      echo "$LINE"
      echo "Voulez vous changer la valeur ?"
      read R
    done
    Le read R ne donne jamais la main, je suppose que c'est à cause du pipe qui possède déjà le flux stdin, mais alors comment saisir une valeur ?

    cdt,
    dosy07
    on oublie toujours que rien n'empêche d'ouvrir d'autres descripteurs de fichiers…

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    exec 3< toto
    while read line <3
    do
      echo "$line"
      echo "Voulez vous changer la valeur ?"
      read R
    done

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Une solution est de dupliquer l'entrée standard vers le file descriptor 3 avant de la rediriger vers le bloc while, et de lire ce file descriptor 3 dans ta boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while read LINE
    do
      echo "$LINE"
      echo "Voulez vous changer la valeur ?"
      read R <&3
      ...
    done 3<&0 < toto

Discussions similaires

  1. Timeout sur read() avec termios et VTIME
    Par olivier857 dans le forum C
    Réponses: 9
    Dernier message: 05/04/2006, 09h30
  2. Double requete avec curseur.
    Par elkamy dans le forum Langage SQL
    Réponses: 2
    Dernier message: 11/01/2006, 11h35
  3. [XSLT]tableau double entrée avec cellule manquante
    Par nferay dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 08/03/2005, 15h07
  4. Restaurer un double-boot avec Lilo
    Par Laurent Gomila dans le forum Administration système
    Réponses: 7
    Dernier message: 28/11/2004, 18h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo