【问题标题】:POSIX: glob() only finds first matchPOSIX:glob() 只找到第一个匹配项
【发布时间】: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 '*' 运行以避免外壳扩展。

标签: c posix glob libc


【解决方案1】:

正如 cmets 中指出的那样:shell 已经完成了 globbing:

./glob * 被解析为./glob a b glob glob.c,因此对glob() 函数的调用仅使用a 作为模式。

致电./glob '*' 解决了问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多