web-dev-qa-db-fra.com

Comment exécuter une commande intégrée Shell avec une fonction C?

Je voudrais exécuter la commande Linux "pwd" via une fonction en langage C comme execv ().

Le problème est qu'il n'y a pas de fichier exécutable appelé "pwd" et je ne peux pas exécuter "echo $ PWD", car echo est également une commande intégrée sans aucun exécutable à trouver.

17
user2851770

Vous devez exécuter sh -c echo $PWD; généralement sh -c exécutera les commandes Shell.

(En fait, system(foo) est défini comme execl("sh", "sh", "-c", foo, NULL) et fonctionne donc pour les fonctions intégrées de Shell.)

Si vous voulez juste la valeur de PWD, utilisez getenv, cependant.

11
Kerrek SB

Si vous souhaitez simplement exécuter la commande Shell dans votre programme c, vous pouvez utiliser,

   #include <stdlib.h>

   int system(const char *command);

Dans ton cas,

system("pwd");

Le problème est qu'il n'y a pas de fichier exécutable appelé "pwd" et je ne peux pas exécuter "echo $ PWD", car echo est également une commande intégrée sans exécutable pour

Que veux-tu dire par là? Vous devriez pouvoir trouver les paquets mentionnés dans / bin /

Sudo find / -executable -name pwd
Sudo find / -executable -name echo
23
smRaj

Vous pouvez utiliser la commande excecl

int execl(const char *path, const char *arg, ...);

Comme montré ici

#include <stdio.h>
#include <unistd.h>
#include <dirent.h>

int main (void) {

   return execl ("/bin/pwd", "pwd", NULL);

}

Le deuxième argument sera le nom du processus tel qu'il apparaîtra dans la table des processus.

Alternativement, vous pouvez utiliser la fonction getcwd () pour obtenir le répertoire de travail actuel:

#include <stdio.h>
#include <unistd.h>
#include <dirent.h>
#define MAX 255

int main (void) {
char wd[MAX];
wd[MAX-1] = '\0';

if(getcwd(wd, MAX-1) == NULL) {
  printf ("Can not get current working directory\n");
}
else {
  printf("%s\n", wd);
}
  return 0;
}
6
PhillipD