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 :

Export d'une variable d'environnement


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    283
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 283
    Par défaut Export d'une variable d'environnement
    Bonjour,

    Je souhaite conserver l'export de la variable ORACLE_SID définie dans le script suivant :

    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
     
    # ecrit dans instance.txt les instances en RAM
    ps -eaf|grep ora_smon|grep -v grep|cut -c 57-64 > instance.txt
     
    # proposer le choix d'une instance
    echo 'Voici les instances disponibles :'
    cat instance.txt
     
    Instance=instance.txt
    export Instance
     
    # CodeReto test le code retour de la boucle
    CodeReto=1
    export CodeReto
     
    # tant que le choix de l'instance est invalide (CodeReto!=0)
    while [ $CodeReto -ne 0 ]
    do
     
    # saisir une instance
    echo 'veuillez choisir une instance'
      read ChoiInst
     
    # verification du choix de l'instance
      VeriChoi=`cat ${Instance} | grep "^${ChoiInst}" | awk -F '{print $1}`
      if [ "$VeriChoi" = "$ChoiInst" ]; then
      CodeReto=0
      else
      CodeReto=1
      fi
     
    # export de la nouvelle instance
      ORACLE_SID=$ChoiInst
      export ORACLE_SID
    done
    Lorsque le script se termine, si je fais un

    Je n'ai rien ...

    Merci pour votre aide,
    A.Personnat

  2. #2
    Membre très actif

    Inscrit en
    Juillet 2008
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 186
    Par défaut
    Bonjour,

    C'est normal. Tu lances le script depuis un processus (un shell peut-être), qui lui-même va créer un processus bash (ou sh ou un autre peu importe). Et le script sera exécuté dans ce nouveau processus, la variable d'environnement y sera bien défine, et exportée vers tous ses processus enfants. Mais à la fin du script, ce processus se termine, et tu retournes dans le processus de départ (le processus parent), dans lequel aucune nouvelle variable n'a été définie.

    Pour faire ce que tu veux, il faut sourcer le script, avec la commande source (ou .) .

    Didier

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    283
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 283
    Par défaut
    Merci pour ces précisions, je viens de tester l'exécution de mon script précédé d'un . afin de le sourcer mais j'obtiens maintenant des erreurs lors de l'exécution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    bash: command substitution: line 1: unexpected EOF while looking for matching `''
    bash: command substitution: line 2: syntax error: unexpected end of file
    Au dela de la signification de ces erreurs, comment se fait-il qu'elles apparaissent quand je source mon script ?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    283
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 283
    Par défaut
    Le pb est résolu, il manquait une ' dans une ligne, curieux ..

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par apersonnat Voir le message
    Le pb est résolu, il manquait une ' dans une ligne, curieux ..
    Oui, dans le "awk".
    D'ailleurs tu peux éliminer un processus dans cette ligne car le grep accepte un nom de fichier en paramètre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    VeriChoi=`grep "^${ChoiInst}" "${Instance}"| awk -F '{print $1}'`
    De plus, il est inutile d'exporter le codeReto puisque tu ne t'en sers pas dans un fils de ce script. D'ailleurs la structure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    mettre 1 dans codeReto
    tant que codeReto pas égal à 0
    faire
        saisir une réponse
        si réponse ok 
            mettre 0 dans codeReto
        sinon
            mettre 1 dans codeReto
    fin faire
    est parfaitement conforme aux règles de la programmation structurée... mais alourdit le code. Déjà pourquoi cette instruction "codeReto=1" dans le else vu que la valeur est déjà à 1 et n'a pas changé entre temps ?
    Et même pour ne pas s'embêter avec ça, il y a bien plus simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    boucle infinie => while true
    faire
        saisir une réponse
        si réponse ok 
            sortie de boucle => break
    fin faire
    Autre chose plus important => le multi-tache multi-utilisateur. Tu écris un script => tu n'es pas garanti que
    1) ce script ne sera exécuté que par toi (multi-utilisateurs)
    2) ce script ne s'exécutera qu'une instance à la fois (multi-tache)
    or dans ce script, tu utilises un fichier "instance.txt" qui a une vocation toute temporaire. Mais si par hasard 2 personnes ou même toi lance ce script plusieurs fois depuis plusieurs terminaux, tu vas avoir un sacré merdier dans ton fichier "instance.txt".

    Quand on écrit un script, toujours penser à ce genre de danger. Le mieux est d'éviter au maximum les fichiers de travail. Mais si on est obligé d'en mettre, alors
    1) les mettre dans "/tmp" ou "$HOME/tmp" qui sont fait pour ça
    2) utiliser la variable "$$" (n° pid) dans le nom de fichier ce qui rend le nom unique et seulement affecté au processus qui l'utilise

    Heureusement, dans ton script, ce fichier est inutile
    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
    #!/bin/sh
    # ecrit dans la variable "instance" les instances en RAM
    instance=`ps -eaf|grep ora_smon|grep -v grep|cut -c 57-64`
     
    echo "Voici les instances disponibles : $instance"
     
    # Boucle de saisie
    while true
    do
      # saisir une instance
      echo 'veuillez choisir une instance'
      read ChoiInst
     
      # verification du choix de l'instance 
      # suffit pour cela de tester directement le grep car tout programme 
      # est directement vérifiable de façon booléenne
      echo "${instance}" | grep "^${ChoiInst}" 1>/dev/null && break
    done
     
    # export de la nouvelle instance (qu'on a sorti de la boucle vu qu'on ne le fait qu'une fois)
    ORACLE_SID=$ChoiInst
    export ORACLE_SID
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. [makefile] export d'une variable d'environnement
    Par tiresias54 dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 26/11/2013, 18h00
  2. [C#] Récupération d'une variable d'environnement
    Par jamy79 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 17/08/2005, 14h03
  3. NASM Tester une variable d'environnement à la "compilat
    Par Pierre Maurette dans le forum Assembleur
    Réponses: 1
    Dernier message: 10/06/2005, 13h27
  4. [BES] Création d'une variable d'environnement
    Par NGI80 dans le forum Autres
    Réponses: 2
    Dernier message: 17/10/2002, 07h31

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