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 :

Entrée pipe et entrée clavier dans le même script


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut Entrée pipe et entrée clavier dans le même script
    Bonjour


    Peut-on cumuler l'entrée par un pipe puis la saisie au clavier dans un même script?
    Si oui, comment?

    Pour l'instant, je fais bien une boucle qui récupère les caractères tapés au clavier.
    Mais si je rajoute, en début de script, une boucle qui lit le fichier passé en pipe, la fermeture de cette communication empêche toute saisie au clavier.

    Une solution?

  2. #2
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 354
    Par défaut
    Bonjour,

    Il faut je pense lire directement sur ton tty ou pty pour ta liaison clavier.

  3. #3
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Sublime! Le stdin reste fermé, puisque consacré au fichier qui ne renvoie plus rien; mais le clavier est pris en compte et le programme fonctionne.

    Je suis passé de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # Lecture du pipe
    while read ligne
    do
        echo $ligne
    done
     
    # Lecture clavier
    while read -sn1 ligne
    do    
        echo -n $ligne
    done
    à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # Lecture du pipe
    while read ligne
    do
        echo $ligne
    done
     
    # Lecture clavier
    while read -sn1 ligne
    do
        echo -n $ligne 
    done </dev/tty
    Merci

  4. #4
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 354
    Par défaut
    Remarque, pour une lecture linéaire (on lit d'abord tout le pipe et ensuite le clavier), [codeinline]cat[codeinline] devient utile, exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat <(echo -e "xxxxx"{1..10}"\n") - | sed 's/xxxx/toto/g'
    Le petit "-" en 2ème argument de cat est l'entrée standart (tout du moins ici).
    Ici le cat va donner au sed les dix lignes puis va attendre que l'on saisisse quelque chose au clavier. (mais bon, perso, je préfère la première solution qui est plus souple)

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    En utilisant les descripteurs de fichiers comme expliqué dans le guide avancé d'écriture des scripts Bash (20.1. Utiliser exec), ça le fait bien aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #! /bin/bash
     
    exec 6<&0
    exec < fich
     
    while read ligne
    do
        echo $ligne
    done
     
    exec 0<&6 6<&-
     
    while read ligne
    do
        echo $ligne
    done

  6. #6
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Les deux dernières solutions pré-supposent que l'on connaît la source d'informations. L'idée est de "piper" n'importe quelle source.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 10/04/2014, 17h06
  2. [Shell] plusieurs commandes sed simultanées dans un même script
    Par hakkio dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 05/12/2011, 14h40
  3. [MySQL] Portée des variables dans un même script
    Par paintbox dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 29/07/2010, 20h11
  4. [Web Service] Deux SoapClient Call dans un même script "failed"?
    Par davtypo3 dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 31/05/2010, 14h18
  5. [MySQL] problème avec deux requetes dans un même script
    Par leclone dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 09/02/2007, 10h28

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