Ok, les habitants. J'ai donc accepté les limites de longueur de la ligne de commande comme évangile depuis un certain temps. Alors, que faire de ses hypothèses? Naturellement, vérifiez-les.
J'ai une machine Fedora 22 à ma disposition (c'est-à-dire Linux avec bash4). J'ai créé un répertoire contenant 500 000 inodes (fichiers) de 18 caractères chacun. La longueur de la ligne de commande est de 9 500 000 caractères. Créé ainsi:
seq 1 500000 | while read digit; do
touch $(printf "abigfilename%06d\n" $digit);
done
Et nous notons:
$ getconf ARG_MAX
2097152
Notez cependant que je peux faire ceci:
$ echo * > /dev/null
Mais cela échoue:
$ /bin/echo * > /dev/null
bash: /bin/echo: Argument list too long
Je peux exécuter une boucle for:
$ for f in *; do :; done
qui est un autre shell intégré.
Lecture attentive de la documentation desARG_MAX
états, longueur maximum d'argument des fonctions exec . Cela signifie: sans appel exec
, il n'y a pas de ARG_MAX
limitation. Cela expliquerait donc pourquoi les fonctions internes du shell ne sont pas limitées par ARG_MAX
.
Et en effet, je peux ls
mon répertoire si ma liste d'arguments contient 109948 fichiers, soit environ 2 089 000 caractères (donner ou prendre). Une fois que j'ajoute un autre fichier de nom de fichier à 18 caractères, j'obtiens une erreur de liste d'arguments trop longue . Cela ARG_MAX
fonctionne donc comme annoncé: l'exécution échoue avec plus de ARG_MAX
caractères sur la liste d'arguments - y compris, il faut le noter, les données d'environnement.