GNU/Linux >> Linux Esercitazione >  >> Linux

Qual è la dimensione massima del valore di una variabile di ambiente Linux?

Non credo che ci sia un limite variabile per ambiente su Linux. La dimensione totale di tutte le variabili d'ambiente messe insieme è limitata a execve() volta. Vedi "Limiti sulla dimensione degli argomenti e dell'ambiente" qui per maggiori informazioni.

Un processo può utilizzare setenv() o putenv() per far crescere l'ambiente oltre lo spazio iniziale allocato da exec.

Ecco un programma veloce e sporco che crea una variabile d'ambiente da 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;
}

Beh, sono almeno 4 milioni sulla mia scatola. A quel punto mi annoiai e me ne andai. Se tutto va bene, l'output del terminale sarà terminato prima di tornare al lavoro lunedì :-)

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 sei preoccupato che 4M possa non essere sufficiente per la tua variabile di ambiente, potresti voler ripensare a come stai facendo le cose.

Forse sarebbe un'idea migliore inserire le informazioni in un file e quindi utilizzare una variabile di ambiente per fare riferimento a quel file. Ho visto casi in cui, se la variabile è nella forma @/path/to/any/fspec , ottiene le informazioni effettive dal file path/to/any/fspec . Se non inizia con @ , utilizza il valore della variabile d'ambiente stessa.

Abbastanza interessante, con tutte quelle variabili impostate, ogni singolo comando inizia a lamentarsi che l'elenco degli argomenti è troppo lungo quindi, anche se ti consente di impostarle, potrebbe non essere in grado di avviare i programmi dopo averlo fatto (poiché deve passare l'ambiente a quei programmi).


Linux
  1. Suggerimenti/trucchi per la navigazione della riga di comando di Linux 3 - la variabile d'ambiente CDPATH

  2. Cosa definisce la dimensione massima per un singolo argomento di comando?

  3. Il valore massimo dell'ID di processo?

  4. Esempi di comandi di esportazione Linux (come impostare le variabili di ambiente)

  5. Qual è l'unità di dimensione predefinita nel comando linux ls -l

Che cos'è la shell in Linux?

Che cos'è Subshell in Linux?

Qual è il comando kill in Linux?

Cosa dovrebbe fare il comando export in Linux?

Qual è il modo migliore per impostare una variabile d'ambiente in .bashrc?

Qual è la dimensione consigliata per una partizione Linux /boot?