Как именно Zsh расширяет глобусы? - PullRequest
6 голосов
/ 05 августа 2009

У меня есть программа на 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.

Ответы [ 2 ]

6 голосов
/ 09 ноября 2009

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

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

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

echo **/*.h | xargs ./a.out
2 голосов
/ 01 октября 2009

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

...