POSIX: glob() 只找到第一个匹配项
POSIX: glob() only finds first match
我很难弄清楚如何正确使用 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 已经进行了通配:
./glob *
已解析为 ./glob a b glob glob.c
,因此对 glob()
函数的调用仅使用 a
作为模式。
调用 ./glob '*'
解决了问题。
我很难弄清楚如何正确使用 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 已经进行了通配:
./glob *
已解析为 ./glob a b glob glob.c
,因此对 glob()
函数的调用仅使用 a
作为模式。
调用 ./glob '*'
解决了问题。