Qual é o tamanho máximo de um valor de variável de ambiente?

Existe um limite para a quantidade de dados que podem ser armazenados em uma variável de ambiente no Linux e, em caso afirmativo: o que é?

Para o Windows, encontrei o seguinte artigo da base de conhecimento que resume: Windows XP ou posterior: 8191 caracteres Windows 2000 / NT 4.0: 2047 caracteres

Eu não acho que exista um limite de variables ​​por ambiente no Linux. O tamanho total de todas as variables ​​de ambiente reunidas é limitado no tempo execve (). Consulte “Limites de tamanho de argumentos e ambiente” aqui para mais informações.

Um processo pode usar setenv () ou putenv () para aumentar o ambiente além do espaço inicial alocado por exec.

Aqui está um programa rápido e sujo que cria uma variável de ambiente 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; } 

Bem, pelo menos 4 milhões na minha checkbox. Nesse momento, fiquei entediado e me afastei. Espero que a saída do terminal termine antes de voltar ao trabalho na segunda-feira 🙂

 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 

Se você está preocupado que a 4M pode não ser suficiente para a sua variável de ambiente, você pode querer repensar como você está fazendo as coisas.

Talvez seja melhor colocar as informações em um arquivo e usar uma variável de ambiente para fazer referência a esse arquivo. Eu vi casos em que, se a variável é da forma @/path/to/any/fspec , obtém as informações reais do path/to/any/fspec do arquivo path/to/any/fspec . Se não começar com @ , ele usa o valor da própria variável de ambiente.


Curiosamente, com todas essas variables ​​configuradas, cada comando começa a reclamar que a lista de argumentos é muito longa, embora você possa configurá-los, pode não ser possível iniciar programas depois de feito (já que é necessário passar o ambiente para esses programas).

Fiz um teste rápido na minha checkbox Linux com o seguinte trecho:

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

Na minha checkbox (Gentoo 3.17.8-gentoo-r1) isso resulta em (últimas linhas de saída):

 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 

Então: o limite é bem alto!

Eu usei este código PHP muito rápido e sujo (abaixo), modificando-o para valores diferentes, e descobri que ele funciona para comprimentos variables ​​de até 128k. Depois disso, por qualquer motivo, não funciona; nenhuma exceção é levantada, nenhum erro é relatado, mas o valor não aparece na subshell.

Talvez este seja um limite específico do php? Talvez existam configurações do php.ini que possam afetá-lo? Ou talvez haja um limite no tamanho de vars que uma subshell herdará? Talvez existam configurações de kernel ou shell relevantes.

De qualquer forma, por padrão, no CentOS, o limite para configurar um var no ambiente via putenv em php parece ser de cerca de 128k.

  

Informação da versão –

 [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) 

Não sei exatamente, mas um experimento rápido mostra que nenhum erro ocorre, por exemplo, com 64kB de valor:

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

A linha de comando (com todo o argumento) mais a variável de ambiente deve ser menor que 128k.