2017-04-03 2 views
0

J'écris en langage C un programme qui contient ces lignes:Exécuter programme shell avec execv

void main(int argc, char *argv[]) { 
    char* file=argv[1]; 
    char* arguments[] = { "sh", argv[2], argv[3], argv[4], file, NULL }; 
    execv("/bin/sh", arguments); 
} 

Le fichier est prog.sh qui contient une simple somme d'arguments:

expr $1 + $2 + $3 

Quand je exécuter le programme en ./main prog.sh 1 2 3 j'obtiens une erreur qui est

/bin/sh: 0: Can't open 1 

Alors que je attendre la sortie 6 (somme de 1 2 3)

+0

Avez-vous ce code compilé? Dans l'exécutable 'expr'. Et ça a l'air * extrêmement * gênant. Vous avez un script shell, appelez un exécutable qui appelle un script shell, appelez l'exécutable ... Cela ne se terminera pas paisiblement. –

+0

Lorsque je cours (sh prog.sh 1 2 3) à partir du terminal cela fonctionne. Non, je n'ai qu'un programme C appelant un script shell :) – Mehdi

+0

Qu'est-ce que 'main'? –

Répondre

2

Regardez vos arguments:

char* arguments[] = { "sh", argv[2],argv[3],argv[4],file, NULL }; 

Lorsque vous exécutez ./main prog.sh 1 2 3, vous finissez par appeler:

sh 1 2 3 prog.sh 

Vous devriez plutôt faire le script le premier argument:

char* arguments[] = { "sh", file, argv[2],argv[3],argv[4], NULL }; 

appeler ainsi

sh prog.sh 1 2 3 
+0

Cela fonctionne. Merci beaucoup ! – Mehdi

+0

Je me demande pourquoi '' sh ''n'a pas besoin d'un' '-c'' après. J'ai passé du temps à essayer de le faire fonctionner avec '" -c "'. –

+1

@VictorSergienko '-c' est pour quand vous voulez évaluer le code de shell dans une chaîne. Ne l'utilisez pas si vous voulez évaluer le code du shell dans un fichier (aka un script) –