2009-08-05 4 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 

Однако такие программы, как ls и grep работы без какой-либо проблемы при вызове с использованием шара **/*.h в той же папке. Почему при вызове моей программы ошибка zsh? Как zsh идет о расширении подстановочных знаков?

Редактировать: Я использую zsh на cygwin.

+0

зачем использовать двойной «*» вместо сингл '*' в командной строке? –

ответ

5

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

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

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

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

Да, это исполняемый файл Windows, запущенный на Cygwin. –

2

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

 Смежные вопросы

  • Нет связанных вопросов^_^