Передает ли список аргументов строковые кавычки в команду exec в C? - PullRequest
2 голосов
/ 09 марта 2012

Я использую execvp для выполнения нового процесса для команды grep -l night *.Вот мой код:

char * argument[5];
char keyword[] = "night";

argument[0] = (char *) malloc (sizeof(char)*25);
argument[1] = (char *) malloc (sizeof(char)*25);
argument[2] = (char *) malloc (sizeof(char)*25);
argument[3] = (char *) malloc (sizeof(char)*25);
argument[4] = (char *) malloc (sizeof(char)*25);

argument[0] = "grep";
argument[1] = "-l";
strcpy(argument[2],keyword);
argument[3] = "*";
argument[4] = NULL;

execvp ("grep", argument);

Но я получаю вывод этой программы как «grep: *: Нет такого файла или каталога», что неверно, поскольку выполнение той же команды из оболочки приводит к появлению спискафайлов, которые содержат текст "ночь".Я подозреваю, что * в списке команд отправляется в виде строки с кавычками на exec.Правильно ли мое предположение?Если так, как я могу исправить эту проблему?Любая помощь будет принята с благодарностью.

1 Ответ

2 голосов
/ 09 марта 2012

Grep не понимает аргумент "*".Обычно оболочка расширяет такие аргументы (она называется globbing ).Конечно, поскольку exec функции не запускают оболочку, вы не получаете эту функциональность.

Вы можете:

  • Использовать функции, которые делают запустить оболочку (system(3), popen(3))
  • Использовать glob(3), по существу выполняя работу с оболочкой

РЕДАКТИРОВАТЬ

Возможно, вы могли бы написать это так ( не проверено ):

glob_t globbuf;
globbuf.gl_offs = 3;

/* Globbing magic. */
glob("*", GLOB_DOOFFS, NULL, &globbuf);

/* That's what the 3 was for. */
globbuf.gl_pathv[0] = "grep";
globbuf.gl_pathv[1] = "-l";
globbuf.gl_pathv[2] = "night";

/* Conveniently, the list is NULL-terminated. */
execvp("grep", globbuf.gl_pathv);
...