¿Cuál es el tamaño máximo de un valor de variable de entorno?

¿Existe un límite en la cantidad de datos que se pueden almacenar en una variable de entorno en Linux? De ser así, ¿qué es?

Para Windows, he encontrado el siguiente artículo de KB que resume a: Windows XP o posterior: 8191 caracteres Windows 2000 / NT 4.0: 2047 caracteres

No creo que haya un límite de variable por entorno en Linux. El tamaño total de todas las variables de entorno reunidas está limitado en execve () time. Consulte “Límites de tamaño de argumentos y entorno” aquí para obtener más información.

Un proceso puede usar setenv () o putenv () para hacer crecer el entorno más allá del espacio inicial asignado por el ejecutivo.

Aquí hay un progtwig rápido y sucio que crea una variable de entorno de 256 MB.

 #include  #include  #include  #include  int main(void) { size_t size = 1 < < 28; /* 256 MB */ char *var; var = malloc(size); if (var == NULL) { perror("malloc"); return 1; } memset(var, 'X', size); var[size - 1] = '\0'; var[0] = 'A'; var[1] = '='; if (putenv(var) != 0) { perror("putenv"); return 1; } /* Demonstrate E2BIG failure explained by paxdiablo */ execl("/bin/true", "true", (char *)NULL); perror("execl"); printf("A=%s\n", getenv("A")); return 0; } 

Bueno, es al menos 4M en mi caja. En ese momento, me aburrí y me alejé. Afortunadamente, la salida del terminal estará terminada antes de que regrese al trabajo el lunes 🙂

 export b1=A export b2=$b1$b1 export b4=$b2$b2 export b8=$b4$b4 export b16=$b8$b8 export b32=$b16$b16 export b64=$b32$b32 export b128=$b64$b64 export b256=$b128$b128 export b512=$b256$b256 export b1k=$b512$b512 export b2k=$b1k$b1k export b4k=$b2k$b2k export b8k=$b4k$b4k export b16k=$b8k$b8k export b32k=$b16k$b16k export b64k=$b32k$b32k export b128k=$b64k$b64k export b256k=$b128k$b128k export b512k=$b256k$b256k export b1m=$b512k$b512k export b2m=$b1m$b1m export b4m=$b2m$b2m echo $b4m AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA : : : : : : : : : : : : AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 

Si le preocupa que 4M no sea suficiente para su variable de entorno, puede reconsiderar cómo está haciendo las cosas.

Tal vez sería una mejor idea colocar la información en un archivo y luego usar una variable de entorno para referenciar ese archivo. He visto casos en los que, si la variable tiene la forma @/path/to/any/fspec , obtiene la información real de la path/to/any/fspec del archivo path/to/any/fspec . Si no comienza con @ , usa el valor de la variable de entorno en sí.


Curiosamente, con todas esas variables establecidas, cada comando comienza a quejarse de que la lista de argumentos es demasiado larga, por lo que, aunque le permita configurarlos, es posible que no pueda iniciar progtwigs una vez que lo haya hecho (ya que tiene que pasar el entorno a esos progtwigs).

Hice una prueba rápida en mi cuadro de Linux con el siguiente fragmento:

 a="1" while true do a=$a$a echo "$(date) $(numfmt --to=iec-i --suffix=B --padding=7 ${#a})" done 

En mi caja (Gentoo 3.17.8-gentoo-r1) esto da como resultado (últimas líneas de salida):

 Wed Jan 3 12:16:10 CET 2018 16MiB Wed Jan 3 12:16:11 CET 2018 32MiB Wed Jan 3 12:16:12 CET 2018 64MiB Wed Jan 3 12:16:15 CET 2018 128MiB Wed Jan 3 12:16:21 CET 2018 256MiB Wed Jan 3 12:16:33 CET 2018 512MiB xrealloc: cannot allocate 18446744071562068096 bytes 

Entonces: ¡el límite es bastante alto!

Usé este código php muy rápido y sucio (abajo), modificándolo para diferentes valores, y encontré que funciona para longitudes variables de hasta 128k. Después de eso, por cualquier razón, no funciona; no se genera ninguna excepción, no se informa ningún error, pero el valor no aparece en la subcadena.

Tal vez este es un límite específico de php? Tal vez hay configuraciones php.ini que pueden afectarlo? ¿O tal vez hay un límite en el tamaño de vars que una subshell heredará? Tal vez haya configuraciones de kernel o configuración de shell relevantes.

De todos modos, de forma predeterminada, en CentOS, el límite para establecer una var en el entorno a través de putenv en php parece ser de aproximadamente 128k.

 < ?php $s = 'abcdefghijklmnop'; $s2 = ""; for ($i = 0; $i < 8100; $i++) $s2 .= $s; $result = putenv('FOO='.$s2); print shell_exec('echo \'FOO: \'${FOO}'); print "length of s2: ".strlen($s2)."\n"; print "result = $result\n"; ?> 

Información de la versión –

 [root@localhost scratch]# php --version PHP 5.2.6 (cli) (built: Dec 2 2008 16:32:08) < ..snip..> [root@localhost scratch]# uname -a Linux localhost.localdomain 2.6.18-128.2.1.el5 #1 SMP Tue Jul 14 06:36:37 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux [root@localhost scratch]# cat /etc/redhat-release CentOS release 5.3 (Final) 

No sé exactamente, pero un experimento rápido muestra que no se produce ningún error, por ejemplo, con 64 kB de valor:

 % perl -e 'print "#include \nint main() { return setenv(\"FOO\", \"", "x"x65536, "\", 1); }\n";'\ | gcc -xc -o envtest - && ./envtest && echo $? 0 

La línea de comando (con todos los argumentos) más la variable de entorno debe ser inferior a 128k.