Ok, habitantes. Así que he aceptado los límites de longitud de la línea de comando como evangelio durante bastante tiempo. Entonces, ¿qué hacer con las suposiciones de uno? Naturalmente, compruébalos.
Tengo una máquina Fedora 22 a mi disposición (es decir, Linux con bash4). He creado un directorio con 500.000 inodos (archivos) cada uno de 18 caracteres de largo. La longitud de la línea de comando es de 9.500.000 caracteres. Creado así:
seq 1 500000 | while read digit; do
touch $(printf "abigfilename%06d\n" $digit);
done
Y notamos:
$ getconf ARG_MAX
2097152
Sin embargo, tenga en cuenta que puedo hacer esto:
$ echo * > /dev/null
Pero esto falla:
$ /bin/echo * > /dev/null
bash: /bin/echo: Argument list too long
Puedo ejecutar un bucle for:
$ for f in *; do :; done
que es otro shell incorporado.
Lectura cuidadosa de la documentación paraARG_MAX
estados, longitud máxima de argumento para las funciones ejecutivas . Esto significa: sin llamar exec
, no hay ARG_MAX
limitación. Por lo tanto, explicaría por qué los elementos integrados de shell no están restringidos por ARG_MAX
.
Y, de hecho, puedo ls
usar mi directorio si mi lista de argumentos tiene 109948 archivos, o aproximadamente 2,089,000 caracteres (más o menos). Sin embargo, una vez que agrego un archivo de nombre de archivo de 18 caracteres más, aparece un error de lista de argumentos demasiado larga . También ARG_MAX
funciona como se anuncia: el ejecutivo está fallando con más de ARG_MAX
caracteres en la lista de argumentos, incluidos, debe tenerse en cuenta, los datos del entorno.