2009-08-05 85 views
5

我有一个C程序,通过遍历argv变量来显示它的命令行。zsh如何扩展球体?

#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 glob调用时出现问题。为什么zsh在调用我的程序时失败? zsh如何去扩展通配符?

编辑:我在cygwin上使用zsh。

+0

为何使用双“*”代替单一的'*'在你的命令行? – 2012-08-17 05:24:14

回答

5

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

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

如果你并不一定需要所有的文件,同时指定参数时,您可以使用xargs的分区,适合在ARG_MAX文件名来块:

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

是的,这是一个在Cygwin上运行的Windows可执行文件。 – 2009-11-09 04:48:54

2

我编译了你的代码,并以类似的方式在当前目录中执行它,并且它没有任何错误消息就能正常工作。此外,我发现这个消息,由某人建议,错误消息“参数列表太长”不存在于zsh的源代码中,因此可能实际上是一个操作系统问题:http://www.zsh.org/mla/workers/1996/msg00060.html