参数列表是否将字符串引号传递给C中的exec命令?
我正在使用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,因此您无法获得该function。
您可以:
- 使用启动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);