zsh是如何扩展通配符的?

6

我有一个C程序,通过迭代argv变量来显示其命令行。

该程序涉及IT技术。
#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

然而,像lsgrep这样的程序在使用相同文件夹中的**/*.h通配符调用时没有任何问题。为什么zsh在调用我的程序时会失败?zsh如何扩展通配符?编辑:我在cygwin上使用zsh。

为什么在命令行中使用双星号 '**' 而不是单星号 '*'? - Daniel YC Lin
2个回答

7

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

ARG_MAX定义了命令行的长度。通常由操作系统设置,并且所有应用程序都受到限制,但在Cygwin上编译的应用程序可以使用比Windows应用程序更大的缓冲区 - 有关示例讨论,请参见this message

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

echo **/*.h | xargs ./a.out

是的,这是在Cygwin上运行的Windows可执行文件。 - Agnel Kurian

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接