Как выполнить встроенную команду 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;
}