【发布时间】:2017-10-03 11:55:46
【问题描述】:
我很难弄清楚如何正确使用glob() 函数。
这是我的简单测试代码:
#include <glob.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
char *path;
if (argc > 1) {
path = argv[1];
} else {
path = "/foo/bar/";
}
glob_t pglob;
int glob_res = glob(path, 0, NULL, &pglob);
switch (glob_res) {
case GLOB_ABORTED:
printf("Glob failed: read error\n");
break;
case GLOB_NOMATCH:
printf("Glob failed: no match\n");
break;
case GLOB_NOSPACE:
printf("Glob failed: oom\n");
break;
default:
printf("Matches: %lu\n", pglob.gl_pathc);
for (unsigned i = 0; i < pglob.gl_pathc; ++i) {
printf("%s\n", pglob.gl_pathv[i]);
}
break;
}
return 0;
}
假设我有一个这样的目录:
$ ls
a b glob glob.c
我希望调用 ./glob * 来打印所有 4 个文件,但它只告诉我第一个文件:
$ ./glob *
Matches: 1
a
我犯了什么愚蠢的初学者错误?
【问题讨论】:
-
shell 在你的程序看到它之前进行扩展,你只处理第一个命令行参数,在这种情况下是
'a',所以你看到的就是这些。跨度> -
shell 扩展了您不想要的
*。以./glob '*'运行以避免外壳扩展。