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

Linux Discussion :

Problème d'export de variable


Sujet :

Linux

  1. #1
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut Problème d'export de variable
    Bonjour,

    le problème sera surement évident pour vous mais bon, je n'y arrive pas ...

    je passe des paramètres de la forme
    HOME_LDR="~\tmp"
    à mon script

    je l'exporte dans les variables d'environnement comme ceci
    export `echo $1`
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if [ -n "${HOME_LDR}" ]
        then
            echo "haha"
            export PROG_CTL=${HOME_LDR}/ctl
            export PROG_SQL=${HOME_LDR}/sql
        else ...
    j'ai bien haha d'affiché
    mais quand je j'affiche mes variables d'env avec set, j'obtiens ceci
    _='HOME_LDR=~/tmp'

    et pas de PROG_CTL ni de PROG_SQL ...

    où est l'erreur ?

    merci d'avance

    PS :

    j'ai aussi essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    eval PARAM${CPTR}=`echo $1`
    export PARAM${CPTR}
    mais là je passe dans le else ...
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  2. #2
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    les variables ne sont valables que pour ton programme, et -quand exportées- dans ton sous programme, mais jamais dans le programme appelant. Ev. sourcer le prog peut aider.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    lsc@chltlxlsc1:~> head x.sh
    export X=1
    lsc@chltlxlsc1:~> echo X=$X
    X=
    lsc@chltlxlsc1:~> x.sh
    lsc@chltlxlsc1:~> echo X=$X
    X=
    lsc@chltlxlsc1:~> . x.sh
    lsc@chltlxlsc1:~> echo X=$X
    X=1

  3. #3
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    peut-être que tu cherches eval $1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    lsc@chltlxlsc1:~> head ev.sh
    eval $1
    echo HOME_LDR=$HOME_LDR
     
    lsc@chltlxlsc1:~> ./ev.sh HOME_LDR=fou
    HOME_LDR=fou

  4. #4
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Citation Envoyé par laurentschneider
    les variables ne sont valables que pour ton programme, et -quand exportées- dans ton sous programme, mais jamais dans le programme appelant. Ev. sourcer le prog peut aider.
    Ca veut dire que si j'appelle ce script depuis un autre, je n'aurais jamais mes variables d'environnment dans le script appelant ? c'est ça que je voulais ...
    J'appelle bien avec ./mon_script pourtant

    Citation Envoyé par laurentschneider
    peut-être que tu cherches eval $1
    j'ai essayé également mais sans plus de succès.

    je me permet de mettre mon script entier au cas où.

    En fait j'ai un premier script qui reçoit les paramètres. Je passe ces paramètres au script que j'essaie de créer pour les enregistrer dans l'environnement. Ensuite (dans le premier script) je me sert des paramètres et des variables d'environnement pour lancer du java ...

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    CPTR=0
    STOP=$#
     
    until [ $CPTR = $STOP ]
        do
            echo "Debut tour $CPTR avec $1"
     
            # For the 6 first variables, the form cannot be like key="value"
            if [[ $CPTR -le 5  &&  "`echo $1|grep '='`" != "" ]]
                then
                    echo "You cannot define keyword parameter before the 6 first mandatory are defined."
                    echo "Process aborted."
                    exit -1
            fi
     
            # For others, check if the param is like key="value"
            if [ $CPTR -gt 5 ]
                then
     
                    # test if the parameter is valid
                    if [ -z "`echo $1|grep '='`" ]
                        then
                            echo "The parameter $1 is not properly formed. It must be like KEY=\"VALUE\""
                            echo "Process aborted."
                            exit -1
                    fi
                    echo "set option"
                    eval $1
     
            fi
     
            echo "end Tour $CPTR"
     
            # shift parameters and increment cptr
            shift
            let CPTR=$CPTR+1
     
        done
     
     
    # set the environment variables depending the values received
    # as optional parameters    
     
    PROG_DIR=$(cd $(dirname $0); pwd)
     
    echo HOME_LDR=${HOME_LDR}
    if [ -n "${HOME_LDR}" ]
        then
            echo "haha"
            export PROG_LOG=${HOME_LDR}/log
            export PROG_CTL=${HOME_LDR}/ctl
            export PROG_SQL=${HOME_LDR}/sql
        else
            echo "hihi"
            export PROG_LOG=${PROG_DIR}/../log
            export PROG_CTL=${PROG_DIR}/../ctl
            export PROG_SQL=${PROG_DIR}/../sql
    fi
     
    # if the TRACE parameter is not set, the potential existing value has to be overwritten
    export TRACE=${TRACE:=noTrace}
    je lance avec (par exemple), où inject_cost est le script appelant celui ci-dessus:
    ./inject_cost.sh 1 2 3 4 5 6 PREFIX="toto" HOME_LDR="~/tmp"

    à l'affichage j'obtiens :

    Debut tour 0 avec 1
    end Tour 0
    Debut tour 1 avec 2
    end Tour 1
    Debut tour 2 avec 3
    end Tour 2
    Debut tour 3 avec 4
    end Tour 3
    Debut tour 4 avec 5
    end Tour 4
    Debut tour 5 avec 6
    end Tour 5
    Debut tour 6 avec PREFIX=toto
    set option
    end Tour 6
    Debut tour 7 avec HOME_LDR=~/tmp
    set option
    end Tour 7
    HOME_LDR=/home1/saturne/pcmo/tmp
    haha

    et je n'ai rien dans mes variables d'environnement ...

    je patauge complet là
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Comme souligné plus haut, le comportement habituel de la commande export dans un script est de faire passer une variable dans l'environnement des scripts enfants.

    Il existe néanmoins un moyen de faire "remonter" un variable dans l'environnement du scripts parent. Il faut "sourcer" l'appel au script. Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #! /bin/sh
    # test.sh
    export ZZZ="Hello"
    Si tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # /chemin/vers/test.sh
    # env | grep ZZZ
    Tu n'auras rien en retour. La variable n'a pas été exportée.

    Mais , si tu fais (avec un point et un espace avant l'invocation du script)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # . /chemin/vers/test.sh
    # env | grep ZZZ
    Tu retrouveras ta variable dans l'environnement du shell parent (appellant).

    Edit (oubli): Attention car si tu as un exit dans le script, le shell "parenr" se terminera ausii tôt!
    :q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
    :quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
    Jabber: ripat at im.apinc.org

  6. #6
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    (je pensais que c'était pareil qu'avec ./ )

    quand je lance avec . mon_script 1 2 3 ...

    je n'ai pas mes variables d'environnement
    de plus je sors du mode bash et je me retrouve à la racine ...

    enfin bon ça doit etre les exit dans le code ....

    le source en gros ça copie/colle le script dans la console ?


    bref, je suis pas sortie de l'auberge.

    En fait si je comprend bien, au moment de l'execution du script mes variables d'env sont bien mises. Mais dès que l'exécution est finie, elles sont perdues ?


    EDIT : Bon alors je me demande, je peux mettre ce genre de code dans une sous-procedure ?


    parce qu'en fait plusieurs scripts doivrnet appeler ce bout de code et ça m'embete de décapliquer ce code ...
    et cette sous procédure, je peux la mettre dans un autre fichier ?

    EDIT 2 : ou alors je renvoie une chaine de caractère de mes export au script parent ? c'est possible ?
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  7. #7
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par in
    enfin bon ça doit etre les exit dans le code ....
    bien vu! si tu sources (avec point), alors il ne faut pas d'exit, sinon ça ne marche pas

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

Discussions similaires

  1. [ksh] Export des variables obligatoire ?
    Par gege2061 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 13/06/2007, 11h08
  2. exporter une variable d'une fonction
    Par omelhor dans le forum Langage
    Réponses: 5
    Dernier message: 10/11/2006, 08h59
  3. Exporter une variable via un script sous KSH
    Par Snivel dans le forum Linux
    Réponses: 4
    Dernier message: 09/12/2005, 16h44
  4. Exportation de variable statique
    Par Laurent Gomila dans le forum C++
    Réponses: 16
    Dernier message: 31/08/2005, 16h32
  5. Réponses: 3
    Dernier message: 23/02/2005, 14h34

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