¿Cómo exactamente zsh expande los globos?
-
22-07-2019 - |
Pregunta
Tengo un programa en C que muestra su línea de comandos iterando a través de la variable 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;
}
Invoqué el programa en una carpeta que contenía un gran árbol fuente de C ++ como este:
./a.out **/*.h
La salida:
zsh: argument list too long: ./a.out
Sin embargo, programas como ls
y grep
funcionan sin ningún problema cuando se invocan utilizando el globo ** / *. h
en la misma carpeta . ¿Por qué zsh
falla al invocar mi programa? ¿Cómo funciona zsh
para expandir los comodines?
Editar: estoy usando zsh en cygwin.
Solución
¿La aplicación que intentó ejecutar es una aplicación de Windows (incluida mingw) o una aplicación Cygwin?
ARG_MAX define la longitud de la línea de comando. Por lo general, está configurado por el sistema operativo y todas las aplicaciones están limitadas a él, pero en Cygwin las aplicaciones compiladas para Cygwin pueden usar un búfer más grande que las aplicaciones de Windows; consulte este mensaje para una discusión de ejemplo.
Si no necesariamente necesita todos los archivos como args al mismo tiempo, puede usar xargs para particionar los nombres de los archivos en bloques que se ajusten a ARG_MAX:
echo **/*.h | xargs ./a.out
Otros consejos
Compilé su código y lo ejecuté en el directorio actual de manera similar y funcionó bien sin ningún mensaje de error. También me encontré con este mensaje publicado por alguien sugiriendo que el mensaje de error "argumento es demasiado largo" no existe en el código fuente de zsh, por lo que podría ser un problema del sistema operativo: http : //www.zsh.org/mla/workers/1996/msg00060.html