Wie genau funktioniert zsh Klackse erweitern?
-
22-07-2019 - |
Frage
Ich habe ein C-Programm, das es Befehlszeile anzeigt, indem durch die argv
Variable iteriert.
#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;
}
ich aufgerufen, um das Programm in einem Ordner einen großen C ++ Quellbaum wie folgt enthalten:
./a.out **/*.h
Der Ausgang:
zsh: argument list too long: ./a.out
Allerdings Programme wie ls
und grep
Arbeit ohne Probleme, wenn im selben Ordner mit dem **/*.h
glob aufgerufen. Warum scheitern zsh
wenn mein Programm aufrufen? Wie funktioniert zsh
gehen über Platzhalter erweitert?
Edit:. Ich benutze zsh auf Cygwin
Lösung
Ist die Anwendung, die Sie haben versucht, eine Windows-Anwendung (einschließlich mingw) oder einem Cygwin-App?
laufenARG_MAX definiert, wie lange die Befehlszeile sein kann. Normalerweise ist es durch das Betriebssystem festgelegt, und alle Anwendungen beschränken sich auf sie, sondern auf Cygwin-Anwendungen für Cygwin zusammengestellt können einen größeren Puffer als Windows-Anwendungen verwenden - siehe diese Nachricht für ein Beispiel Diskussion.
Wenn Sie nicht unbedingt alle Dateien als args zur gleichen Zeit benötigen, können Sie xargs verwenden, um die Dateinamen Blöcke zu unterteilen, die in ARG_MAX passen:
echo **/*.h | xargs ./a.out
Andere Tipps
ich Sie Code kompiliert und ausgeführt es im aktuellen Verzeichnis in einer ähnlichen Art und Weise und es funktionierte gut ohne Fehlermeldungen. Auch kam ich auf dieser Nachricht von jemandem geschrieben darauf hindeutet, dass die Fehlermeldung „Argument-Liste zu lang“ existiert nicht in dem Souce-Code für zsh so könnte in der Tat ein O Problem sein: http://www.zsh.org/mla/workers/1996/msg00060.html