linux - ¿Se aplica la restricción "lista de argumentos demasiado larga" a los componentes integrados de shell?
bash unix (2)
Parece que no entiendo si la restricción de longitud se aplica a la construcción de conchas o no.
Probablemente no, pero debe verificar el código fuente de su versión particular de
bash
(ya que es software libre).
Sin embargo, obviamente, existe una limitación –esperablemente mayor– (en particular porque algunos
malloc
realizados dentro de
bash
podrían fallar), pero luego obtendrá otro mensaje de error o comportamiento.
AFAIK, el error de la lista de argumentos es demasiado largo dado que
execve(2)
falla con
E2BIG
, y las funciones integradas de bash no se
fork
luego se
execve
(como lo hacen los comandos que invocan programas externos).
En la práctica,
E2BIG
puede aparecer con unos pocos cientos de miles de bytes (el límite exacto depende del kernel y el sistema), pero supongo que los builtins podrían usarse en varias docenas de megabytes (en los escritorios de hoy).
Pero YMMV (ya que podría usar
ulimit
para que su shell haga algo de
setrlimit(2)
...).
No recomendaré el manejo de gigabytes de datos a través de shell incorporados.
Por cierto,
xargs(1)
puede ser útil, e incluso podría aumentar el límite (para
E2BIG
)
E2BIG
compilar su núcleo (y también de otras maneras, en los núcleos recientes).
Hace unos años, fue una gran motivación para mí recompilar los núcleos.
He navegado por muchas
posts
en Stack Overflow, así como en algunas comunidades relacionadas con respecto a la
argument list too long
tema
argument list too long
y parece que no entiendo claramente si la restricción de longitud se aplica a las construcciones de shell o no.
Digamos que quiero pasar una cadena muy larga a un comando a través de la entrada estándar:
string="a very long list of words ..."
Puedo decir:
# not using double quotes around $string is deliberate
printf ''%s/n'' $string | cmd ...
o
cmd <<< $string
O incluso canalizarlo a
xargs
:
printf ''%s/n'' $string | xargs cmd ...
¿Alguien puede aclarar esto?
En bash, la limitación impuesta por el sistema operativo en la longitud de la línea de comandos que causa que la
argument list too long
error sea
argument list too long
no se aplica a los componentes integrados de shell.
Este error se desencadena cuando el
execve()
syscall devuelve el código de error
E2BIG
.
No hay una llamada
execve()
involucrada cuando se invoca un incorporado, por lo que el error no puede tener lugar.
Por lo tanto, ambas operaciones propuestas son seguras:
cmd <<< "$string"
escribe
$string
en un archivo temporal, lo que no requiere que se pase como un elemento argv (o una variable de entorno, que se almacena en el mismo piscina de espacio reservado);
e
printf ''%s/n'' "$cmd"
tiene lugar internamente en el shell a menos que la configuración del shell se haya modificado, como con
enable -n printf
, para usar una implementación externa de
printf
.