¿La restricción de “lista de argumentos demasiado larga” se aplica a los shell builtins?

He navegado a través de muchas publicaciones en Stack Overflow, así como en algunas comunidades relacionadas con la argument list too long tema argument list too long y no parece saber claramente si la restricción de longitud se aplica a los builtins 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 hace que la argument list too long error sea argument list too long no se aplica a las construcciones internas del shell.

Este error se activa cuando execve() syscall devuelve el código de error E2BIG . No hay una llamada execve() involucrada cuando se invoca un comando 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, que no requiere que se pase como un elemento argv (o una variable de entorno, que se almacena en el mismo grupo de espacio reservado); y printf '%s\n' "$cmd" tiene lugar dentro del shell a menos que la configuración del shell haya sido modificada, como con enable -n printf , para usar una implementación externa de printf .

Parece que no sé si la restricción de longitud se aplica a las construcciones internas de shell o no.

Probablemente no, pero debería verificar el código fuente de su versión particular de bash (ya que es software libre). Sin embargo, obviamente hay una limitación mucho mayor (en particular porque algunos malloc realizados dentro de bash pueden fallar), pero luego obtendrás otro mensaje de error o comportamiento.

AFAIK, el error de la lista de argumentos es demasiado largo porque execve (2) falla con E2BIG , y las funciones integradas de bash no se fork luego se execve (como lo hacen los comandos que invocan progtwigs externos).

En la práctica, E2BIG podría aparecer con algunos cientos de miles de bytes (el límite exacto depende del kernel y del sistema), pero creo que los editores integrados podrían usarse en varias docenas de megabytes (en los escritorios actuales). Pero YMMV (ya que podrías usar ulimit para que tu caparazón haga algún setrlimit (2) …). No recomendaré manipular gigabytes de datos a través de shell builtins.

Por cierto, xargs (1) puede ser útil, e incluso podrías boost el límite (para E2BIG ) al recomstackr tu kernel (y también a través de otras formas, en kernels recientes). Hace algunos años esa fue una gran motivación para mí para recomstackr kernels.