c - 参数列表是否将字符串引号传递给 C 中的 exec 命令?

标签 c string grep execvp

我正在使用 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:*:没有这样的文件或目录” 这是不正确的,因为从 shell 执行相同的命令会产生以下列表 包含文本“night”的文件。我确实怀疑命令列表中的 * 正在被 作为带引号的字符串发送给 exec。我的假设正确吗?如果是这样我该如何解决这个问题?任何帮助将不胜感激。

最佳答案

Grep 不理解“*”参数。通常 shell 会扩展此类参数(称为 globbing )。当然,由于 exec 函数不会启动 shell,因此您无法获得该功能。

你可以:

  • 使用启动 shell 的函数(system(3)popen(3))
  • 使用glob(3) ,本质上是做 shell 工作

编辑

您可能可以这样写(未经测试):

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);

关于c - 参数列表是否将字符串引号传递给 C 中的 exec 命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9625225/

相关文章:

c - 从 char * 指向的内存的一个字节中检索 long int 和 float 的值

java - 如何将字符串格式化为特定模式

actionscript-3 - AS3 URL 字符串 -> URLRequest

linux - 哪个更快? `echo` ing 一个变量,或者 `tail` ing 一个长输出文件,或者 `grep` ing 整个东西

sed - 如何grep仅存在于一行中一定数量的空格内的字符串

c - 根据 settimeofday 调整基于 CLOCK_REALTIME 的计时器

c - 使用 json-c 时出现 undefined reference 错误

Javascript 替换一个字符串

windows - 如何 awk -f 最后一个之后的所有内容\

多个测试文件的CMake配置