Вопрос

У меня есть программа на 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 в той же папке. , Почему zsh завершается ошибкой при вызове моей программы? Как zsh расширяет подстановочные знаки?

Изменить. Я использую zsh в Cygwin.

Это было полезно?

Решение

Является ли приложение, которое вы пытались запустить, приложением Windows (включая mingw) или приложением Cygwin?

ARG_MAX определяет длину командной строки. Обычно он устанавливается операционной системой, и все приложения ограничены этим, но в приложениях Cygwin, скомпилированных для Cygwin, может использоваться больший буфер, чем в приложениях Windows - см. это сообщение для примера обсуждения.

Если вам не обязательно требовать одновременного использования всех файлов в качестве аргументов, вы можете использовать xargs для разделения имен файлов на блоки, которые соответствуют ARG_MAX:

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

Другие советы

Я скомпилировал ваш код и выполнил его в текущем каталоге аналогичным образом, и он работал нормально, без каких-либо сообщений об ошибках. Также я наткнулся на это сообщение, опубликованное кем-то, предлагающим, что сообщение об ошибке «список аргументов слишком длинный» не существует в исходном коде для zsh, поэтому может быть проблема с ОС: http : //www.zsh.org/mla/workers/1996/msg00060.html

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top