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 :

dispo de l'entree standard


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut dispo de l'entree standard
    Bonjour à tous.

    Depuis quelques jours, je me pose une question existencielle à laquelle je n'ai pas encore obtenue de réponse.

    En fait que désirerais écrire une fonction dont les attributs pourraient être à la fois passés en paramètre ou bien consommé via un pipe.
    Un petit exemple vaut bien souvent de long discours :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    # exemple avec passage de paramètre
    maFonction "unAttribut" "unAutreAttribut"
     
    # exemple avec pipe :
    echo "unAttribut unAutreAttribut"|maFonction
    Pour résoudre ce problème voici comment j'ai procédé à l'interieur de ma fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    function maFonction {
       if [[ "$#" != "0" ]] ; then
          mesAttributs=$*
       else
          mesAttributs=$(cat)
       fi
       echo "mesAttributs=${mesAttributs}"
    }
    # Exemples d'utilisation qui fonctionnent
    maFontion att1 att2
    echo "att1 att2"|maFonction
    Le problème avec cette méthode se situe lors de l'utilisation du pipe. Si la commande avant pipe ne sort rien, alors le cat situé dans la fonction se bloque en attendant indéfiniment que quelque chose arrive :
    uneCommande|maFonction
    Si une uneCommande n'envoit rien en sortie, cela bloque.

    Mes questions :
    - Ma méthode pour réaliser une telle fonction est-elle bonne ? En existe-t-il d'autre(s) ?
    - Y aurait-il quelque chose d'alternatif au cat qui par exemple planterait ($? != 0) si aucun flux n'arrive ? Dans tel cas, je pourrait traiter le cas d'un flux vide à l'intérieur de la fonction.

    Sinon j'ai contourné le problème en imposant l'utilisation de passage de paramètre. On peut donc dire que mon problème est fonctionnellement résolu. Mais cette question me "turlupine" depuis quelques jours, et comme je n'aime pas rester sans réponse, je fais appel à vous "o grands maîtres du développement shell"

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 663
    Par défaut
    Qu'est-ce que tu espères de mesAttributs=$(cat) ?

    Utilise plutôt read mesAttributs
    ...
    ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    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,

    Sans changer le script, il est possible de changer simplement son appel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    monScript arg1 arg2 arg3
    monScript <<< echo arg1 arg2 arg3

  4. #4
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    Citation Envoyé par jmelyn Voir le message
    Bonjour,

    Sans changer le script, il est possible de changer simplement son appel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    monScript arg1 arg2 arg3
    monScript <<< echo arg1 arg2 arg3
    Bonjour mon problème n'est pas au niveau du passage des paramètres mais de l'utilisation du pipe qui peut être blocant si aucune donnée n'est transmise à ce pipe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    unScriptQuiRetourneDesChosesOuRienDuTout|maFonction
    Le problème se pose lorsque le script/fonction de gauche ne produit rien du tout.

  5. #5
    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
    C'est un problème général: cat (sans argument) lit sur stdin et recopie sur stdout, et ce jusqu'à la fin de chaîne. Donc blocage tant que fin de chaîne non détectée. Pareil avec read, mais cette commande accepte plus d'arguments, notamment un timeout pour éviter ce genre de blocage intempestif (-t nSec).

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 663
    Par défaut
    Code traduit : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    si le nombre d'arguments est différent de zéro
       alors
          mesAttributs vaut tous les arguments passés à maFonction
       sinon (s'il n'y a pas d'arguments)
          mesAttributs vaut 'cat' #mais cat quoi?
    fin_si
    afficher mesAttributs
    J'avais pensé que tu souhaitais que l'utilisateur entre lui-même les arguments, c'est pourquoi je proposai 'read'...

    Tout dépend de ce que tu veux faire dans le cas où il n'y a pas d'arguments passés à maFonction.
    Tu peux éventuellement faire afficher un message, puis quitter la fonction en utilisant 'return'
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    maFonction() {
    if [ $# -ne 0 ]
       then
          mesAttributs="$*"
          echo "$mesAttributs"
       else
          echo "Il n'y a pas d'arguments, je quitte la fonction"
          return 1
    fi
    }
    ...
    ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Qu'est-ce que tu espères de mesAttributs=$(cat) ?
    Je constate que le pipe appliqué à la fonction est "tansmis" à la première commande gérant le pipe dans la fonction. J'ai mis cat pour l'exemple. J'utilise de cette manière awk dans d'autres fonction.
    En fait, je souhaite récupérer les données transmises par le pipe, en faisant ce "mesAttributs=$(cat)", ces données sont transmise au cat et récupérées par ce dernier.
    S'il y avait une commande magique permettant de récupérer tout ce qui vient de ce pipe, ça solutionnerait tout problème. On pourrait imager une commande du genre "mesAttribut=$(commandeMagique)".

    Utilise plutôt read mesAttributs
    ...
    ?
    Je ne suis pas au taf et n'ai donc mas les moyens de tester maintenant, mais je crains que si aucune donnée n'est transmise, le read ne bloque lui aussi ?

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/07/2007, 08h00
  2. comment lire les arguments sur l'entree standard
    Par batotoba dans le forum ANT
    Réponses: 1
    Dernier message: 04/09/2006, 17h50
  3. Lecture entree standard
    Par mrttlemonde dans le forum C
    Réponses: 11
    Dernier message: 20/05/2006, 21h09
  4. Processus en background et entrée standard
    Par kennn13 dans le forum Linux
    Réponses: 1
    Dernier message: 26/01/2006, 17h31
  5. Awk - interpréter l'entrée standard
    Par narmataru dans le forum Linux
    Réponses: 7
    Dernier message: 26/01/2005, 10h40

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