linux bash shell unix command-line-arguments

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 .