Je ne pense pas qu'il y ait une limite de variable par environnement sous Linux. La taille totale de toutes les variables d'environnement réunies est limitée à execve()
temps. Voir "Limites sur la taille des arguments et de l'environnement" ici pour plus d'informations.
Un processus peut utiliser setenv()
ou putenv()
pour développer l'environnement au-delà de l'espace initial alloué par l'exécutif.
Voici un programme rapide et grossier qui crée une variable d'environnement de 256 Mo.
#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;
}
Eh bien, c'est au moins 4M sur ma boîte. À ce moment-là, je me suis ennuyé et je me suis égaré. J'espère que la sortie du terminal sera terminée avant mon retour au travail lundi :-)
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 vous craignez que 4M ne soit pas suffisant pour votre variable d'environnement, vous voudrez peut-être repenser votre façon de faire.
Il serait peut-être préférable de placer les informations dans un fichier, puis d'utiliser une variable d'environnement pour référencer ce fichier. J'ai vu des cas où, si la variable est de la forme @/path/to/any/fspec
, il obtient les informations réelles du fichier path/to/any/fspec
. Si ce n'est pas commencer par @
, il utilise la valeur de la variable d'environnement elle-même.
Chose intéressante, avec toutes ces variables définies, chaque commande commence à se plaindre que la liste d'arguments est trop longue donc, même si elle vous permet de les définir, il se peut qu'elle ne puisse pas démarrer les programmes après l'avoir fait (puisqu'elle doit transmettre l'environnement à ces programmes).