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 :

Execution d'une instruction dans un script


Sujet :

Linux

  1. #1
    Débutant  
    Inscrit en
    Mai 2006
    Messages
    705
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 705
    Points : 117
    Points
    117
    Par défaut Execution d'une instruction dans un script
    Salut à tous,

    J'ai un fichier (eucarc) qui contient un script (un ensemble d'export) que je dois l'exécuter...

    Voiçi le contenu du fichier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    EUCA_KEY_DIR=$(dirname $(readlink -f ${BASH_SOURCE}))
    export S3_URL=http://192.168.100.200:8773/services/Walrus
    export EC2_URL=http://192.168.100.200:8773/services/Eucalyptus
    export EC2_PRIVATE_KEY=${EUCA_KEY_DIR}/euca2-user-183cc615-pk.pem
    export EC2_CERT=${EUCA_KEY_DIR}/euca2-user-183cc615-cert.pem
    export EC2_JVM_ARGS=-Djavax.net.ssl.trustStore=${EUCA_KEY_DIR}/jssecacerts
    export EUCALYPTUS_CERT=${EUCA_KEY_DIR}/cloud-cert.pem
    export EC2_ACCESS_KEY='FHrTEhX9VREs5hOniDkCuzBqo1u6h5zS2UAuQ'
    export EC2_SECRET_KEY='1TaNZYjh44SDeoXjqD82LBsJpviUEvZLZ8A'
    # This is a bogus value; Eucalyptus does not need this but client tools do.
    export EC2_USER_ID='85282913713091180366415881031032700936'
    alias ec2-bundle-image="ec2-bundle-image --cert ${EC2_CERT} --privatekey ${EC2_PRIVATE_KEY$
    alias ec2-upload-bundle="ec2-upload-bundle -a ${EC2_ACCESS_KEY} -s ${EC2_SECRET_KEY} --url$
    Je voulais exécuter chaque ligne,sous l'invite de commande, à part ... mais en exécutant la première instruction,
    EUCA_KEY_DIR=$(dirname $(readlink -f ${BASH_SOURCE}))
    j'ai eu ce message d'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    readlink: opérande manquante
    Pour en savoir davantage, faites: « readlink --help ».
    dirname: opérande manquante
    Pour en savoir davantage, faites: « dirname --help ».


    Je me suis dis pourquoi pas remplacer les deux variables dirname et readlink par leurs valeurs, mais j'ai pas su quoi mettre ni quoi faire !

    Avez vous des suggestions ? Merci

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

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

    il faut définir un shebang cohérent avec le contenu du script, soit ici : , et, selon l'effet attendu, exécuter le script :, ou sourcer le script

  3. #3
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,


    readlink: opérande manquante
    Est-ce que "${BASH_SOURCE}" est défini au moins ?


  4. #4
    Membre confirmé Avatar de ben.IT
    Homme Profil pro
    Inscrit en
    Janvier 2009
    Messages
    431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 431
    Points : 486
    Points
    486
    Par défaut
    dans ton cas, lorsque tu auras résolu ton pb de variable, il faudra sourcer le fichier.

    soit :
    soit
    a+
    ben

  5. #5
    Membre chevronné

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Points : 1 894
    Points
    1 894
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Bonjour,

    il faut définir un shebang cohérent avec le contenu du script, soit ici : , et, selon l'effet attendu, exécuter le script :, ou sourcer le script
    Sauf erreur, tu n'es pas obligé de définir un shebang si tu source ton fichier non ? Le shebang ne sert qu'à l'exécution il me semble...

  6. #6
    Membre confirmé Avatar de ben.IT
    Homme Profil pro
    Inscrit en
    Janvier 2009
    Messages
    431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 431
    Points : 486
    Points
    486
    Par défaut
    oui tu n'es pas obligé de remettre un shebang lors d'un source (ce n'est qu'une sorte de include).

    Par exemple, pour la personnalisation de mon environnement shell, dans mon fichier .bashrc j'ai mis un source vers un fichiers contenant tous mes variables et cci dans lequel il n'y a pas de shebang.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #customization
    source ~/.customize_bashrc
    a+
    ben

  7. #7
    Débutant  
    Inscrit en
    Mai 2006
    Messages
    705
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 705
    Points : 117
    Points
    117
    Par défaut
    Je sais que lorsque je source mon fichier, tout ce passe bien !

    Mais je veut le faire en ligne de codes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     String[] cmd = { "/bin/sh", "-c","EUCA_KEY_DIR=$(dirname $(readlink -f ${BASH_SOURCE}))" };
                Process p = Runtime.getRuntime().exec(cmd);
    mais le résultat est le message d'erreur décrit précédement !

    Même quand je fais la même ligne avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     String[] cmd = { "/bin/sh", "-c","source file" };
                Process p = Runtime.getRuntime().exec(cmd);
    j'obtiens toujours le même erreur !

  8. #8
    Membre confirmé Avatar de ben.IT
    Homme Profil pro
    Inscrit en
    Janvier 2009
    Messages
    431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 431
    Points : 486
    Points
    486
    Par défaut
    comme te l'as justement conseillé zip31, es tu sur que ta variable ${BASH_SOURCE} est bien définie ?

    Pour cela, dans un shell fais un echo :
    a+
    ben

  9. #9
    Débutant  
    Inscrit en
    Mai 2006
    Messages
    705
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 705
    Points : 117
    Points
    117
    Par défaut
    Autre chose:

    J'ai essayé celle ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    String[] cmd = { "/bin/sh", "-c","cd /home/user/euca2-user-x509; source eucarc" };
                Process p = Runtime.getRuntime().exec(cmd);
    J'obtiens:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    /bin/sh: source: not found

  10. #10
    Membre confirmé Avatar de ben.IT
    Homme Profil pro
    Inscrit en
    Janvier 2009
    Messages
    431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 431
    Points : 486
    Points
    486
    Par défaut
    d'après ce que je comprends, tu essayes d’exécuter du shell par des appels systèmes en java.
    Assures toi d'abords que ton script fonctionne en shell classique avant.

    Si tu n'es pas sur de la syntaxe en JAVA, règle d'abord ce problème en regardant comment faire un simple "hello world" proprement afin de te lancer sur un script dont tu n'es pas sur qu'il soit valide... ensuite tu pourras executer ton script
    a+
    ben

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 589
    Points : 19 474
    Points
    19 474
    Par défaut
    /bin/sh n'est probablement pas un lien vers bash !

    un export de variables depuis un sous-processus ne modifie pas l'environnement du processus parent.

  12. #12
    Débutant  
    Inscrit en
    Mai 2006
    Messages
    705
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 705
    Points : 117
    Points
    117
    Par défaut
    d'après ce que je comprends, tu essayes d’exécuter du shell par des appels systèmes en java.
    Assures toi d'abords que ton script fonctionne en shell classique avant.
    -Vous avez raison: j'essaie d’exécuter du shell par des appels systèmes en java.
    - Mon script fonctionne parfaitement en shell classique !

    J'ai tenté d'exécuter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    String[] cmd = { "/bin/sh", "-c","cd /home/user/; ls" };
                Process p = Runtime.getRuntime().exec(cmd);
    et ça marche 100%

  13. #13
    Débutant  
    Inscrit en
    Mai 2006
    Messages
    705
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 705
    Points : 117
    Points
    117
    Par défaut
    J'ai rien compris !!!

    ne retourne rien !!!

    mais je RE-dis que quand je fais
    tout se passe bien !

  14. #14
    Membre chevronné

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Points : 1 894
    Points
    1 894
    Par défaut
    Quand tu fais source machintruc dans le shell, tu utilises sans doute bash comme shell, donc ça passe.

    Quand tu lances ton appel java, tu lances /bin/sh qui n'est visiblement pas bash. Or, source n'est pas une commande de sh.
    Remplacer /bin/sh par /bin/bash pourra peut-être corriger ce point:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String[] cmd = { "/bin/bash", "-c","cd /home/user/euca2-user-x509; source eucarc" };
                Process p = Runtime.getRuntime().exec(cmd);
    Pour info, $BASH_SOURCE est valorisé justement quand tu sources un fichier en bash avec le chemin appelé pour sourcer ledit fichier. C'est pour ça que echo $SOURCE_BASH ne renvoie rien lancé depuis un shell !

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ echo $BASH_SOURCE
     
    $ cat test/test.source
    EUCA_KEY_DIR=$(dirname $(readlink -f ${BASH_SOURCE}))
    EUCA_KEY_SRC=$BASH_SOURCE
    $ source test/test.source
    $ echo $EUCA_KEY_DIR
    /home/user/test
    $ echo $EUCA_KEY_SRC
    test/test.source

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 589
    Points : 19 474
    Points
    19 474
    Par défaut
    BASH_SOURCE est censée assister le debugger bash.

    elle n'existe en effet qu'au sein d'un script (comme FUNCNAME n'existe que dans une fonction).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #!/bin/bash
     
    echo $BASH_SOURCE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ ./monScript
    ./monScript

  16. #16
    Débutant  
    Inscrit en
    Mai 2006
    Messages
    705
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 705
    Points : 117
    Points
    117
    Par défaut
    Alek-C: Vous avez complètement raison ...
    ça m'a résoulule problème !! Merci

    En effet, j'ai un autre obstacle :

    j'ai fait comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    String[] cmd = { "/bin/bash", "-c","cd /home/user/euca2-user-x509; source eucarc" };
                Process p = Runtime.getRuntime().exec(cmd);
     
               String[] cmd2 = { "/bin/sh", "-c","euca-add-keypair '"+Keyname_Fld.getText()+"' > '"+Keyname_Fld.getText()+"'.priv" };
                Process p2 = Runtime.getRuntime().exec(cmd2);
    Avec euca-add-keypair est une commande qui permet de générer un clé tout comme ssh-keygen !
    Mais mon code ne marche plus, parceque tout simplement (d'après ce que j'ai compris) ces 2 lignes de codes permet d'ouvrir deux Shell dont le deuxième n'a pas reçu le "source file" ...
    J'ai tenté de tout mettre dans une seule ligne genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    String[] cmd = { "/bin/bash", "-c","cd /home/esprit/euca2-user-x509; source eucarc; euca-add-keypair '"+Keyname_Fld.getText()+"' > '"+Keyname_Fld.getText()+"'.priv" };
                Process p = Runtime.getRuntime().exec(cmd);
    Mais pendant l'exécution, mon programme se plainte !

  17. #17
    Membre confirmé Avatar de ben.IT
    Homme Profil pro
    Inscrit en
    Janvier 2009
    Messages
    431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 431
    Points : 486
    Points
    486
    Par défaut
    tu peux rajouter le source dans le script keygen ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #!/bin/bash
    source file
    #instruction du script keygen

  18. #18
    Débutant  
    Inscrit en
    Mai 2006
    Messages
    705
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 705
    Points : 117
    Points
    117
    Par défaut
    Désolé !
    J'ai un problème même lorsque j'exécute la commande euca-add-keypair dans un shell à part !

    C'est à dire que depuis le message de "Alek-C", tout est, normalement, rentrée dans l'ordre

    Merci beaucoup à vous tous!!!

  19. #19
    Débutant  
    Inscrit en
    Mai 2006
    Messages
    705
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 705
    Points : 117
    Points
    117
    Par défaut
    Juste une petite question :

    Quelle est la signification du "-c" dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String[] cmd = { "/bin/bash", "-c","cd /home/user/euca2-user-x509; source eucarc" };
    Merci !

  20. #20
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,

    Citation Envoyé par L'aigle de Carthage Voir le message
    Juste une petite question :

    Quelle est la signification du "-c" dans
    String[] cmd = { "/bin/bash", "-c","cd /home/user/euca2-user-x509; source eucarc" };Merci !
    man bash :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    -c chaîne
        Si l'argument -c est présent, les commandes sont interprétées depuis la chaîne 
        fournie. S'il existe d'autres arguments après la chaîne, ils sont transmis comme
        paramètres positionnels, en commençant par $0.

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

Discussions similaires

  1. Une erreur dans un script
    Par tsing dans le forum Linux
    Réponses: 9
    Dernier message: 16/03/2006, 15h50
  2. [FLASH MX2004] Comment mettre une pause dans un script
    Par vbcasimir dans le forum Flash
    Réponses: 3
    Dernier message: 16/02/2006, 09h47
  3. Réponses: 2
    Dernier message: 16/01/2006, 15h07
  4. Changer de base à l'intérieure d une instance dans un script
    Par Labienus dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 02/12/2005, 16h03
  5. Créer une table à partir d'une autre dans un script
    Par Dam)rpgheaven dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 24/06/2005, 10h55

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