Rechercher : dans
Par :

Passage arguments script shell langage c

Dernière réponse le 22 fév 2009 à 16:09:13 sebjuve, le 22 fév 2009 à 13:24:40 
 Signaler ce message aux modérateurs

Bonjour,

Voici mon problème : j'utilise la fonction system pour exécuter un script shell dans un programme en langage c. Ce scipt shell possède des arguments ( $1 , $2 ...). J'aimerais pouvoir saisir ces arguments dans mon programme en langage c. J'ai cherché et tenté la commande suivante :
execl("mon script", argv[1],argv[2],(char*)NULL).
J'ai donc pensé que $1 correspondrait à argv[1] et ainsi de suite. Mais cette commande ne fonctionne pas. Quelqu'un pourrait m'expliquer pourquoi et me dire comment faire.
Merci d'avance pour votre aide.

Configuration: Windows Vista
Firefox 3.0.6

Meilleures réponses pour « Passage arguments script shell langage c » dans :
Langage C++ - Les types de données VoirLes types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître...
Langage C - Les types de données VoirLes types de données Les données manipulées en langage C sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître l'occupation mémoire (le...

1

fiddy, le 22 fév 2009 à 14:10:59

Salut,
Tu as oublié de te donner l'argument correspondant en bash à $0.
Ce qui donnerait :

execl("mon script", "nomScript",argv[1],argv[2],NULL);

Cdlt
Google is your friend

Répondre à fiddy

2

sebjuve, le 22 fév 2009 à 15:09:40

Merci pour ton aide.
Je m'en suis rendu compte mais cela ne fonctionne toujours pas. Voici ma ligne de code :

int retour;
retour = execl("/home/mon_script","mon script",argv[1],argv[2],NULL);v
Ensuite je teste la valeur de retour et affiche une éventuelle erreur à l'aide de perror. Voici le retour :
Exec format error.

Une idée ?

Répondre à sebjuve

3

fiddy, le 22 fév 2009 à 15:24:54

Probablement parce que tu n'as pas mis de shebang dans ton script.
Dans ton fichier script, mets en première ligne :

#!/bin/sh
(à adapter suivant le chemin à sh).
Google is your friend

Répondre à fiddy

4

sebjuve, le 22 fév 2009 à 15:28:57

Bon j'ai trouvé la solution la commande est :

retour = execl("/bin/sh","sh","nom_script",argv[1],argv[2],NULL);

Mais après l'exécution de cette commande, le reste du programme ne s'exécute pas.

Répondre à sebjuve

5

fiddy, le 22 fév 2009 à 15:36:05

Oui, c'est normal puisque l'image du processus sera changée par celle du programme appelée.
En gros, après execl les instructions ne seront pas exécutées, sauf en cas d'erreur.
Si tu veux continuer les instructions d'après, il ne faut pas utiliser la famille exec, mais system.
Tu vas devoir te créer une chaîne contenant "tonscript arg0 arg1 arg2" ou "/bin/sh tonscript arg0 arg1 arg2" (si tu n'as pas mis de shebang) et le faire passer en argument à system.
Google is your friend

Répondre à fiddy

6

sebjuve, le 22 fév 2009 à 15:39:31

Salut,

Les arguments de mon scripts ne sont pas fixes. C'est pour cela que j'utilise argv[1] et argv[2]. avec system je suis obligé de les rentrer en dur. Non?

Répondre à sebjuve

7

fiddy, le 22 fév 2009 à 15:44:58

Quand je disais "/bin/sh arg0 arg1", je sous-entendais de faire une chaîne de caractères qui contiendra la valeur de l'argument argv[0] argv[1] définit à l'exécution. Tu peux utiliser pour ça la fonction snprintf.
Par exemple :

char commande[150];
snprintf(commande,sizeof commande,"/bin/sh tonscript script %s %s %s",argv[1], argv[2], argv[3]);
system(commande);

Google is your friend

Répondre à fiddy

8

sebjuve, le 22 fév 2009 à 16:05:36

C'est une très bonne idée! Merci beaucoup pour ton aide.

Répondre à sebjuve

9

 sebjuve, le 22 fév 2009 à 16:09:13

Merci beaucoup ça marche parfaitement. J'espère un jour te renvoyer l'ascenseur.
Merci bonne fin de week-end.

Répondre à sebjuve