Nemyslím si, že v Linuxu existuje limit proměnných pro jednotlivé prostředí. Celková velikost všech proměnných prostředí dohromady je omezena na execve()
čas. Další informace naleznete v části „Omezení velikosti argumentů a prostředí“.
Proces může používat setenv()
nebo putenv()
k rozšíření prostředí nad počáteční prostor přidělený exec.
Zde je rychlý a špinavý program, který vytvoří proměnnou prostředí o velikosti 256 MB.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
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;
}
No, na mé krabici je to minimálně 4M. V tu chvíli jsem se nudil a šel pryč. Doufejme, že výstup z terminálu bude dokončen, než se v pondělí vrátím do práce :-)
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
Pokud se obáváte, že 4M nemusí stačit pro vaši proměnnou prostředí, možná budete chtít přehodnotit, jak věci děláte.
Možná by bylo lepší vložit informace do souboru a pak použít proměnnou prostředí k odkazování na tento soubor. Viděl jsem případy, kdy, pokud je proměnná ve tvaru @/path/to/any/fspec
, získá aktuální informace ze souboru path/to/any/fspec
. Pokud není začíná @
, používá hodnotu samotné proměnné prostředí.
Je zajímavé, že když jsou všechny tyto proměnné nastavené, každý jednotlivý příkaz si začne stěžovat, že seznam argumentů je příliš dlouhý, takže i když vám je umožňuje nastavit, nemusí být schopen spustit programy poté, co to uděláte (protože musí předat prostředí těmto programům).