D'accord, habitants. J'ai donc accepté les limites de longueur de la ligne de commande comme étant des évangiles 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 avec 500 000 inodes (fichiers) dont chacun mesure 18 caractères de long. 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 une autre commande intégrée au shell.
Une lecture attentive de la documentation pour ARG_MAX
indique, Longueur maximale de l'argument des fonctions exec. Cela signifie : Sans appeler exec
, il n'y a pas de limitation de ARG_MAX
. C'est pourquoi les commandes intégrées au shell ne sont pas limitées par ARG_MAX
.
Et en effet, je peux faire un ls
sur mon répertoire si ma liste d'arguments comporte 109948 fichiers, soit environ 2 089 000 caractères (à quelques variations près). Une fois que j'ajoute un fichier supplémentaire de 18 caractères, cependant, j'obtiens une erreur Liste d'arguments trop longue. Ainsi, ARG_MAX
fonctionne comme annoncé : l'exécution échoue avec plus de ARG_MAX
caractères dans la liste des arguments - incluant, il convient de le noter, les données d'environnement.