Descubrí que esto generaría el error "argumento demasiado largo":
ls *.*
Y esto no lo plantearía:
for file in *.*
do
echo $file
done
¿Por qué?
Descubrí que esto generaría el error "argumento demasiado largo":
ls *.*
Y esto no lo plantearía:
for file in *.*
do
echo $file
done
¿Por qué?
Respuestas:
El error de "argumento demasiado largo" es E2BIGprovocado por la execvellamada al sistema si el tamaño total de los argumentos (más el entorno, en algunos sistemas) es demasiado grande. La execvellamada es la que inicia procesos externos, específicamente cargando un archivo ejecutable diferente (hay una llamada diferente fork, para ejecutar un proceso separado cuyo código todavía es del mismo archivo ejecutable). El forbucle es una construcción de shell interna, por lo que no implica llamar execve. El comando ls *.*genera el error no cuando el globo se expande sino cuando lsse llama.
execvefalla con el error E2BIGcuando el tamaño total de los argumentos para el comando es mayor que el ARG_MAX límite . Puede ver el valor de este límite en su sistema con el comando getconf ARG_MAX. (Es posible que pueda superar este límite si tiene suficiente memoria; mantener bajo ARG_MAXgarantías que execvefuncionará siempre que no se produzca un error no relacionado).
execvelímite es impuesto por el núcleo, pone límites porque los argumentos deben copiarse a través de la memoria del núcleo en un punto y no se puede permitir que los procesos del usuario soliciten una cantidad arbitraria de memoria de shell. Dentro del shell, no hay razón para tener ningún límite, todo lo que cabe en la memoria virtual está bien.
Supongo que en el primer ejemplo lsse ejecuta a bashtravés de una llamada al sistema fork/ execpair, en el segundo, todo el trabajo es interno bash.
La execllamada tiene límites, el funcionamiento interno bashno tiene (o mejor, tiene límites diferentes que no tienen nada que ver exec, tal vez la cantidad de memoria disponible).
execen /usr/include/linux/limits.husualmente, definido como ARG_MAX.
Porque en el caso de lsesto es un argumento, y el número de argumentos es limitado.
En el caso del forciclo, es solo una lista de elementos. No hay límites (hasta donde yo sé) para eso.
for i in {00000001..20000000} ;do ((10#$i==1)) && break; done
/bin/bashvs./bin/sh(que quizás sea un enlace al guión)?