6

我有一个 C 程序,它通过遍历argv变量来显示它的命令行。

#include <stdio.h>

int main(int argc, char *argv[]){
    int i = 0;
    printf("----------\n");
    for(i = 0; i < argc; i++)
        printf("%s\n", argv[i]);
    return 0;
}

我在一个包含大型 C++ 源代码树的文件夹中调用了该程序,如下所示:

./a.out **/*.h

输出:

zsh: argument list too long: ./a.out

但是,当使用同一文件夹中的 glob 调用程序时,喜欢ls并且可以正常工作。为什么调用我的程序时会失败?如何扩展通配符?grep**/*.hzshzsh

编辑:我在 cygwin 上使用 zsh。

4

2 回答 2

7

您尝试运行的应用程序是 Windows 应用程序(包括 mingw)还是 Cygwin 应用程序?

ARG_MAX定义命令行的长度。通常它由操作系统设置,所有应用程序都仅限于此,但在 Cygwin 上为 Cygwin 编译的应用程序可以使用比 Windows 应用程序更大的缓冲区 - 请参阅此消息以获取示例讨论。

如果您不一定需要同时将所有文件作为 args,则可以使用 xargs 将文件名分区为适合 ARG_MAX 的块:

echo **/*.h | xargs ./a.out
于 2009-11-08T21:43:29.487 回答
2

我编译了你的代码并以类似的方式在当前目录中执行它,它运行良好,没有任何错误消息。我还看到有人发布的这条消息,暗示 zsh 的源代码中不存在错误消息“参数列表太长”,因此实际上可能是操作系统问题:http ://www.zsh.org/mla/workers /1996/msg00060.html

于 2009-10-01T00:47:14.610 回答