command-line - zsh 究竟是如何扩展 globs 的?

标签 command-line wildcard zsh glob

我有一个 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/

相关文章:

ruby - 来自命令行的 Ruby 函数的手册页

windows - 这些批处理代码行是做什么用的?

r - 如何根据条件 "contains"一个字符对向量进行子集化?

regex - 是否可以测试正则表达式以查看其是否减少为。*

java - 如何制作没有 double 和 float 的通配符

java - 使用basename在java中命名输出文件

shell - 通过脚本编辑 Perforce 标签的描述

bash - 为什么在可执行文件或脚本名称之前需要 ./(点斜杠)才能在 bash 中运行它?

bash - 为什么 ZSH 卡在空重定向上?

macos - ZSH PATH 变量条目在 OS X Catalina 上向后