Как именно Zsh расширяет глобусы?
-
22-07-2019 - |
Вопрос
У меня есть программа на 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