Précédent   Forum des professionnels en informatique > Systèmes > Linux
Linux Forum d'entraide sur le système Linux. Avant de poster -> Tutoriels Linux, F.A.Q Linux
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/05/2011, 17h43   #1
Débutant
 
Inscription : mai 2006
Messages : 529
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 529
Points : 61
Points : 61
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 :
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,
Citation:
EUCA_KEY_DIR=$(dirname $(readlink -f ${BASH_SOURCE}))
j'ai eu ce message d'erreur:

Code :
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
L'aigle de Carthage est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/05/2011, 18h04   #2
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 070
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 070
Points : 4 153
Points : 4 153
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
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 21
Vieux 09/05/2011, 18h17   #3
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Salut,


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

__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 10/05/2011, 09h09   #4
Membre éprouvé
 
Avatar de ben.IT
 
Homme Benoît
Inscription : janvier 2009
Messages : 392
Détails du profil
Informations personnelles :
Nom : Homme Benoît
Âge : 24
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : janvier 2009
Messages : 392
Points : 438
Points : 438
dans ton cas, lorsque tu auras résolu ton pb de variable, il faudra sourcer le fichier.

soit :
soit
a+
ben
__________________
Meet the free software gang
ben.IT est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 10/05/2011, 10h22   #5
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
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...
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 10/05/2011, 10h35   #6
Membre éprouvé
 
Avatar de ben.IT
 
Homme Benoît
Inscription : janvier 2009
Messages : 392
Détails du profil
Informations personnelles :
Nom : Homme Benoît
Âge : 24
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : janvier 2009
Messages : 392
Points : 438
Points : 438
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 :
1
2
3
 
#customization
source ~/.customize_bashrc
a+
ben
__________________
Meet the free software gang
ben.IT est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 10/05/2011, 11h04   #7
Débutant
 
Inscription : mai 2006
Messages : 529
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 529
Points : 61
Points : 61
Je sais que lorsque je source mon fichier, tout ce passe bien !

Mais je veut le faire en ligne de codes:

Code :
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 :
1
2
 String[] cmd = { "/bin/sh", "-c","source file" };
            Process p = Runtime.getRuntime().exec(cmd);
j'obtiens toujours le même erreur !
L'aigle de Carthage est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/05/2011, 11h12   #8
Membre éprouvé
 
Avatar de ben.IT
 
Homme Benoît
Inscription : janvier 2009
Messages : 392
Détails du profil
Informations personnelles :
Nom : Homme Benoît
Âge : 24
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : janvier 2009
Messages : 392
Points : 438
Points : 438
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
__________________
Meet the free software gang
ben.IT est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/05/2011, 11h12   #9
Débutant
 
Inscription : mai 2006
Messages : 529
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 529
Points : 61
Points : 61
Autre chose:

J'ai essayé celle ci :

Code :
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 :
1
2
 
/bin/sh: source: not found
L'aigle de Carthage est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/05/2011, 11h19   #10
Membre éprouvé
 
Avatar de ben.IT
 
Homme Benoît
Inscription : janvier 2009
Messages : 392
Détails du profil
Informations personnelles :
Nom : Homme Benoît
Âge : 24
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : janvier 2009
Messages : 392
Points : 438
Points : 438
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
__________________
Meet the free software gang
ben.IT est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/05/2011, 11h21   #11
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 070
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 070
Points : 4 153
Points : 4 153
/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.
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 10/05/2011, 11h25   #12
Débutant
 
Inscription : mai 2006
Messages : 529
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 529
Points : 61
Points : 61
Citation:
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 :
1
2
3
 
String[] cmd = { "/bin/sh", "-c","cd /home/user/; ls" };
            Process p = Runtime.getRuntime().exec(cmd);
et ça marche 100%
L'aigle de Carthage est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/05/2011, 11h28   #13
Débutant
 
Inscription : mai 2006
Messages : 529
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 529
Points : 61
Points : 61
J'ai rien compris !!!

ne retourne rien !!!

mais je RE-dis que quand je fais
tout se passe bien !
L'aigle de Carthage est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 10/05/2011, 11h47   #14
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
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 :
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 :
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
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 10/05/2011, 11h47   #15
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 070
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 070
Points : 4 153
Points : 4 153
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 :
1
2
3
#!/bin/bash
 
echo $BASH_SOURCE
Code :
1
2
$ ./monScript
./monScript
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 10/05/2011, 12h05   #16
Débutant
 
Inscription : mai 2006
Messages : 529
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 529
Points : 61
Points : 61
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 :
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 :
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 !
L'aigle de Carthage est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 10/05/2011, 12h12   #17
Membre éprouvé
 
Avatar de ben.IT
 
Homme Benoît
Inscription : janvier 2009
Messages : 392
Détails du profil
Informations personnelles :
Nom : Homme Benoît
Âge : 24
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : janvier 2009
Messages : 392
Points : 438
Points : 438
tu peux rajouter le source dans le script keygen ?

Code :
1
2
3
#!/bin/bash
source file
#instruction du script keygen
__________________
Meet the free software gang
ben.IT est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/05/2011, 15h24   #18
Débutant
 
Inscription : mai 2006
Messages : 529
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 529
Points : 61
Points : 61
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!!!
L'aigle de Carthage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 13h20   #19
Débutant
 
Inscription : mai 2006
Messages : 529
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 529
Points : 61
Points : 61
Juste une petite question :

Quelle est la signification du "-c" dans
Code :
String[] cmd = { "/bin/bash", "-c","cd /home/user/euca2-user-x509; source eucarc" };
Merci !
L'aigle de Carthage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 13h29   #20
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
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 :
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.
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h04.


 
 
 
 
Partenaires

Hébergement Web