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 :

Récupérer une variable lorsqu'on fait un pipe


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Par défaut Récupérer une variable lorsqu'on fait un pipe
    Bonjour,
    j'ai un script ou je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    cpt=0 
    find "/home/dossier"  -name '*.php'| while read fic reste
    		do		
    			echo $fic			
       			cpt=$(($cpt + 1))
    			echo $cpt
    		done
     
    echo $cpt
    Et cela m'affiche donc 0 car le pipe crée un sous shell si j'ai bien compris.
    Donc ma question est comment faire pour récupérer les variables lorsqu'on fait un pipe ou du moins est-ce possible?
    Merci.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    Bonjour,

    le pipe crée un sous shell si j'ai bien compris
    c'est bien ça.

    il y a plusieurs méthodes pour éviter d'utiliser un pipe :
    100% bash :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    shopt -s nullglob globstar
    for f in ./**/*.php
    do test -f "$f" && ((cnt++))
    done
    echo "$cnt fichiers *.php"
    ou avec une substitution de processus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while read f
    do ((cnt++))
    done < <(find . -type f -name "*.php")
    ou alors, en conservant le pipe, avec des commandes groupées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    find ... | { while read f
    do ((cnt++))
    done
    echo $cnt;}
    ça, ça peut être compliqué : ça dépend de la distance entre la boucle et l'echo
    là ,ça va, mais si l'utilisation de la variable est plus éloignée, ça peut nuire à la lisibilité du script.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Par défaut
    Ok merci finalement j'ai utilisé la 2ème solution et ça fonctionne!:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    cpt=0    
    while read fic reste
    do
         echo $fic			
         cpt=$(($cpt + 1))
         echo $cpt
    done < <(find "/home/dossier" -name '*.php')
    echo $cpt

  4. #4
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    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 347
    Par défaut
    Une autre méthode "barbare" c'est de joué sur les redirection en utilisant des pipe nommé...

    Sinon, je demande un avis aux experts, si on exporte les variables, les sous shell en hérite ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    Citation Envoyé par disedorgue
    si on exporte les variables, les sous shell en hérite ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ var="peu importe"
    $ (echo "$var")
    peu importe
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    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 347
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ var="peu importe"
    $ (echo "$var")
    peu importe
    Mouais, pas probant l'exemple, l'expansion est fait en amont ici, non ?

    Et ma question, était plus sur le fait que le sous-shell modifie la valeur, est-ce que la modification est globale ou locale (je reconnais, j'ai la flemme de vérifier )?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    l'expansion est fait en amont ici, non ?
    non, elle s'effectue dans le sous-shell.
    ma question, était plus sur le fait que le sous-shell modifie la valeur, est-ce que la modification est globale ou locale
    «ce qui arrive à Vegas, reste à Vegas» : un processus fils (un sous-shell) ne peut modifier les valeurs des variables du processus parent que dans son instance.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ var="peu importe"
    $ (echo "$var"; var="ici, c'est Vegas"; echo "$var"); echo "$var"
    peu importe
    ici, c'est Vegas
    peu importe
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

Discussions similaires

  1. [Ant] Récupérer une variable d'envionnement
    Par lionel69 dans le forum ANT
    Réponses: 4
    Dernier message: 25/01/2007, 10h22
  2. Récupérer une variable --> Javascript+CSS
    Par Skarlix dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 30/08/2005, 16h01
  3. [Applet] récupérer une variable PHP ?
    Par Shiryu44 dans le forum Applets
    Réponses: 10
    Dernier message: 22/03/2005, 11h39
  4. [JSTL] Récupérer une variable du style <%String bob = "bobby"%>
    Par nickoshiba dans le forum Taglibs
    Réponses: 2
    Dernier message: 15/03/2005, 08h50
  5. récupérer une variable
    Par boucher_emilie dans le forum ASP
    Réponses: 9
    Dernier message: 05/07/2004, 10h34

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