我有一个 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
但是,像
ls
这样的程序和 grep
使用 **/*.h
调用时没有任何问题。 glob 在同一个文件夹中。为什么zsh
调用我的程序时失败?怎么样zsh
去扩展通配符?编辑:我在 cygwin 上使用 zsh。
最佳答案
您尝试运行的应用程序是 Windows 应用程序(包括 mingw)还是 Cygwin 应用程序?
ARG_MAX定义命令行的长度。通常它是由操作系统设置的,所有应用程序都限于它,但是在 Cygwin 上为 Cygwin 编译的应用程序可以使用比 Windows 应用程序更大的缓冲区 - 参见 this message例如讨论。
如果您不一定需要同时将所有文件作为 args,您可以使用 xargs 将文件名分区为适合 ARG_MAX 的块:
echo **/*.h | xargs ./a.out
关于command-line - zsh 究竟是如何扩展 globs 的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1232302/