Question

J'ai un programme C qui affiche sa ligne de commande en effectuant une itération dans 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;
}

J'ai appelé le programme dans un dossier contenant une grande arborescence source C ++, comme ceci:

./a.out **/*.h

La sortie:

zsh: argument list too long: ./a.out

Cependant, des programmes tels que ls et grep fonctionnent sans problème lorsqu'ils sont appelés à l'aide de la commande ** / *. h dans le même dossier. . Pourquoi zsh échoue-t-il lors de l'appel de mon programme? Comment zsh procède-t-il pour développer des caractères génériques?

Modifier: j'utilise zsh sur cygwin.

Était-ce utile?

La solution

L'application pour laquelle vous avez essayé de lancer une application Windows (y compris mingw) ou une application Cygwin?

ARG_MAX définit la durée de la ligne de commande. Généralement, il est défini par le système d'exploitation et toutes les applications y sont limitées. Toutefois, sur les applications Cygwin compilées pour Cygwin, vous pouvez utiliser une mémoire tampon plus grande que les applications Windows - voir ce message pour un exemple de discussion.

Si vous n'avez pas nécessairement besoin de tous les fichiers comme arguments en même temps, vous pouvez utiliser xargs pour partitionner les noms de fichiers en blocs qui tiennent dans ARG_MAX:

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

Autres conseils

Je vous ai compilé le code et l’exécuté dans le répertoire courant d’une manière similaire et cela a fonctionné sans aucun message d’erreur. De plus, je suis tombé sur ce message posté par une personne suggérant que le message d'erreur "liste d'arguments trop longue". n'existe pas dans le code source de zsh, ce qui pourrait donc être un problème de système d'exploitation: http : //www.zsh.org/mla/workers/1996/msg00060.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top