Как выполнить встроенную команду Shell с помощью функции C?

Я хотел бы выполнить команду Linux "pwd" с помощью функции языка C, такой как execv().

Проблема заключается в том, что нет исполняемого файла с именем "pwd", и я не могу выполнить "echo $PWD", так как эхо также является встроенной командой без исполняемого файла.

Ответ 1

Вы должны выполнить sh -c echo $PWD; обычно sh -c будет выполнять команды оболочки.

(Фактически, system(foo) определяется как execl("sh", "sh", "-c", foo, NULL) и, следовательно, работает для встроенных оболочек.)

Если вам просто нужно значение PWD, используйте getenv.

Ответ 2

Если вы просто хотите выполнить команду оболочки в своей программе c, вы можете использовать

   #include <stdlib.h>

   int system(const char *command);

В вашем случае

system("pwd");

Проблема заключается в том, что нет исполняемого файла с именем "pwd", и я не могу выполнить "echo $PWD", так как эхо также является встроенной командой без исполняемого файла.

Что вы подразумеваете под этим? Вы должны уметь находить упомянутые пакеты в /bin/

sudo find / -executable -name pwd
sudo find / -executable -name echo

Ответ 3

Вы можете использовать команду excecl

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

Как показано здесь

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

int main (void) {

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

}

Второй аргумент будет именем процесса, так как он появится в таблице процессов.

В качестве альтернативы вы можете использовать функцию getcwd() для получения текущего рабочего каталога:

#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;
}