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.

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top