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 :

Propagation de l'environnement au dela d'un while


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2002
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 137
    Points : 621
    Points
    621
    Par défaut Propagation de l'environnement au dela d'un while
    Bonjour,

    J'aimerai comprendre soit le pourquoi, soit le comment faire de la gestion des variables d'environnement dans une boucle while et surtout de leur propagation

    Voici deux exemples de code semblables mais qui ne donnent pas le même résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    FILE_ID=0
    ls -w 1 /home | while read file
    do
        echo "$FILE_ID"
        FILE_ID=$(( $FILE_ID + 1 ))
    done
    echo "final : $FILE_ID"
    0
    1
    2
    3
    4
    5
    final : 0

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    FILE_ID=0
    while read file
    do
        echo "$FILE_ID"
        FILE_ID=$(( $FILE_ID + 1 ))
    done <<EOF
    `ls -w 1 /home`
    EOF
    echo "final : $FILE_ID"
    0
    1
    2
    3
    4
    5
    final : 6
    Comment se fait-il que dans le 1er cas la valeur de la variable FILE_ID ne survive pas au dela de la boucle while ?!

    Merci pour vos éclairages !

  2. #2
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 298
    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 298
    Points : 12 778
    Points
    12 778
    Par défaut
    Bonjour,

    Dans le premier cas, tu passes par un sous shell suite au pipe, c'est la cause de la perte de tes variables dans ta boucle while.
    Cordialement.

  3. #3
    Membre confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2002
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 137
    Points : 621
    Points
    621
    Par défaut
    Merci.

    Et y a-t-il un moyen de ne pas passer dans un sous-shell histoire de conserver un environnement commun entre la boucle et le reste du script ?


    Pour info, un collègue me dit qu'il y a 20 ans ça fonctionnait à l'identique dans les 2 exemples et que tout d'un coup a un changement de version ça n'a plus fonctionné (mais ça remonte et il ne sait plus à quel moment ça a basculé)

  4. #4
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 252
    Points : 13 478
    Points
    13 478
    Par défaut
    Citation Envoyé par gRRosminet Voir le message
    Et y a-t-il un moyen de ne pas passer dans un sous-shell histoire de conserver un environnement commun entre la boucle et le reste du script ?
    Bonjour,

    c'est marrant. Pour résoudre le problème de ton premier script, nous donnerions sans doute comme solution ton second script.

    Mais prends bien note que tu peux envoyer des tas de choses à ton 'while':
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ while read ligne; do ...; done < fichier
    $ while read ligne; do ...; done < <(ls -w 1 /home)
    $ while read ligne; do ...; done <<EOF
    blabla
    EOF
    $ while read ligne; do ...; done <<< $ma_variable
    $ while read ligne; do ...; done < mon_pipe_nomme
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  5. #5
    Membre confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2002
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 137
    Points : 621
    Points
    621
    Par défaut
    Merci pour vos reponses. Je ne connaissais pas la 2eme avec la commande entre parenthèses.

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 252
    Points : 13 478
    Points
    13 478
    Par défaut
    On appelle cela une substitution de commande.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 562
    Points : 19 397
    Points
    19 397
    Par défaut
    Bonjour,

    dans le premier cas, le pipe (|) crée un sous-interpréteur en dehors duquel les variables qui y sont créées n'existent pas.
    le deuxième cas, lit un flux venant d'un document en ligne, ça pourrait être celui d'une redirection d'un fichier.

    ON N'UTILISE PAS ls DANS UN SCRIPT !!!

    ça fonctionnait à l'identique dans les 2 exemples et que tout d'un coup a un changement de version
    quel comportement ? lequel des deux ?
    version de quel interpréteur ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Membre confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2002
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 137
    Points : 621
    Points
    621
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    ON N'UTILISE PAS ls DANS UN SCRIPT !!!
    Ce n'est pas le sujet de la question, d'autant plus que la ça me sert juste générer l'itération, mais je suis curieux ... pourquoi pas de ls dans un script ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 562
    Points : 19 397
    Points
    19 397
    Par défaut
    à cause de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    fichier avec des espaces
    fichier\
    avec\
    alinea
    ...
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Membre confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2002
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 137
    Points : 621
    Points
    621
    Par défaut
    Citation Envoyé par gRRosminet Voir le message
    il y a 20 ans ça fonctionnait à l'identique dans les 2 exemples et que tout d'un coup a un changement de version ça n'a plus fonctionné
    Citation Envoyé par N_BaH Voir le message
    quel comportement ? lequel des deux ?
    version de quel interpréteur ?
    A l'époque l'environnement était bien conservé à la sortie du while qui lit depuis le pipe.
    Quant à l'interpréteur, c'était du bsh, mais la version ....

  11. #11
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 842
    Points
    7 842
    Par défaut
    Citation Envoyé par gRRosminet Voir le message
    A l'époque l'environnement était bien conservé à la sortie du while qui lit depuis le pipe.
    Quant à l'interpréteur, c'était du bsh, mais la version ....
    Ce n'était pas du bash qui a toujours eu ce comportement horripilant mais ksh qui place la dernière partie d'un pipe dans le shell courant. Si tu ne veux pas de régressios dans tes scripts, tu peux utiliser ksh.
    ɹǝsn *sıɹɐlos*

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 562
    Points : 19 397
    Points
    19 397
    Par défaut
    bash a désormais une option lastpipe (à positionner avec shopt) pour exécuter la dernière partie d'un pipe dans l'interpréteur courant.
    pour ma part, j'utilise plutôt une redirection d'une substitution de processus.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  13. #13
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par jlliagre Voir le message
    Ce n'était pas du bash qui a toujours eu ce comportement horripilant mais ksh qui place la dernière partie d'un pipe dans le shell courant. Si tu ne veux pas de régressios dans tes scripts, tu peux utiliser ksh.
    Mouais...
    Je me souviens avoir vérifié que certains ksh utilisent aussi un sous-process dans la dernière partie d'un ksh. :-(
    Je ne me souviens plus desquels, peut-être pdksh (ou bien sous solaris, AIX ou HP-UX).

  14. #14
    Membre confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2002
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 137
    Points : 621
    Points
    621
    Par défaut
    Connaissant bien mon collègue il a une très forte tendance à toujours utiliser bsh.
    C'est pas impossible que le bsh ait changé de mode de fonctionnement à un moment donné. Cela dit, toutes les machines ou je viens d'essayer avec du ksh transmettent bien l'environnement

  15. #15
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 842
    Points
    7 842
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Mouais...
    Je me souviens avoir vérifié que certains ksh utilisent aussi un sous-process dans la dernière partie d'un ksh. :-(
    Je ne me souviens plus desquels, peut-être pdksh (ou bien sous solaris, AIX ou HP-UX).
    Je faisait référence aux versions de ksh issues du code écrit par David Korn, ksh88 et ksh93, celles que l'on retrouve en particulier sous les Unix que tu cites, mais qui est aussi disponible sur Linux depuis pas mal d'années maintenant que ksh93 est open source.

    En revanche, je ne faisait pas référence à pdksh qui n'est pas un "vrai" ksh, juste une réimplémentation limitée et qui en effet a un comportement identique à bash pour ce qui concerne les pipelines.

    Citation Envoyé par gRRosminet Voir le message
    Connaissant bien mon collègue il a une très forte tendance à toujours utiliser bsh.
    C'est pas impossible que le bsh ait changé de mode de fonctionnement à un moment donné. Cela dit, toutes les machines ou je viens d'essayer avec du ksh transmettent bien l'environnement
    Je croyais à une faute de frappe pour "bash" quand j'ai lu "bsh". Ton collègue utilise-t-il AIX où bsh est le bourne shell original (celui de Steve Bourne) ?

    Si c'est le cas, je doute qu'une version du Bourne shell ait pu placer les fins de pipelines dans le shell courant. Ça aurait introduit une incompatibilité avec les scripts existants, ce que les éditeurs d'OS essaient d'éviter lorsque c'est possible.
    ɹǝsn *sıɹɐlos*

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

Discussions similaires

  1. Propagation des variables d'environnement
    Par Klyne2 dans le forum Apache
    Réponses: 4
    Dernier message: 20/10/2010, 22h57
  2. Virer l environnement...
    Par Kukrapok dans le forum DirectX
    Réponses: 1
    Dernier message: 18/11/2002, 05h47
  3. [BES] Création d'une variable d'environnement
    Par NGI80 dans le forum Autres
    Réponses: 2
    Dernier message: 17/10/2002, 07h31
  4. nom de fichier et variables d'environnement
    Par joebarthib dans le forum Langage
    Réponses: 2
    Dernier message: 18/07/2002, 15h21
  5. Réponses: 4
    Dernier message: 18/07/2002, 13h32

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