Вы можете использовать popen, как и в своем вопросе. Вы можете передать cmd, который вы хотите выполнить, в качестве аргумента вызова программы, например, если ваша программа называется myexecute
, вызов командной строки будет выглядеть следующим образом:
myexecute folder2 'ls -l'
или
myexecute 'another folder' 'ls'
Обратите внимание на одинарные кавычки, чтобы получить аргумент, если в аргумент включены пробелы.
С помощью chdir
вы можете изменить текущий рабочий каталог. Вывод команды можно прочитать в al oop и вывести на стандартный вывод. Наконец, с помощью pclose вы ожидаете, пока связанный процесс завершится sh, и он даже вернет состояние завершения выполненной команды, на случай, если вам это интересно.
Ваш слегка измененный код может выглядеть так это:
#include <stdio.h>
#include <stdlib.h>
#include <libgen.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
if(argc != 3) {
fprintf(stderr, "usage: %s '<dir>' '<cmd>'\n", basename(argv[0]));
return EXIT_FAILURE;
}
if(chdir(argv[1]) != 0) {
perror(argv[1]);
return EXIT_FAILURE;
}
FILE *f = popen(argv[2], "r");
if (!f) {
perror("popen failed");
return EXIT_FAILURE;
}
char buf[1024];
while (fgets(buf, sizeof(buf), f)) {
printf("%s", buf);
}
if (pclose(f) != 0) {
perror("pclose failed");
}
return EXIT_SUCCESS;
}