什么是环境变量值的最大尺寸是多少?什么是环境变量值的最大尺寸是多少?(What is the max

2019-05-16 13:43发布

是否有限定,可以存储在一个环境变量在Linux上,如果是这样的数据量:是什么呢?

对于Windows,我发现下面的知识库文章 ,总结到:Windows XP或更高版本:8191个字符的Windows 2000 / NT 4.0:2047个字符

Answer 1:

我不认为这是在Linux上每个环境变量限制。 放在一起的所有环境变量的总大小为的execve()的时间是有限的。 请参见“关于参数和环境大小的限制” 这里了解更多信息。

进程可以使用setenv()或putenv()函数成长环境超出EXEC分配的初始空间。

下面是创建一个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;
}


Answer 2:

嗯,这是至少4M的我的盒子。 在这一点上,我觉得无聊便走开了。 希望之前,我回来上班周一:-)端子输出将完成

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

如果你担心4M可能不足以为您的环境变量,你可能要重新考虑你是如何做的事情。

或许,这将是一个更好的主意,把信息转化为一个文件,然后使用环境变量来引用该文件。 我在哪里见过,如果变量的形式为案件@/path/to/any/fspec ,它从文件中获取的实际信息path/to/any/fspec 。 如果首先@ ,它使用环境变量本身的价值。


有趣的是,所有这些变量设定,每一个命令开始抱怨参数列表过长的话,即使它可以让你设置它们,也未必能够启动程序,你已经这样做了之后(因为它有通过环境,这些程序)。



Answer 3:

我做了一个快速测试对我的Linux主机,下面的代码片段:

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

在我的盒子(Gentoo的3.17.8-的Gentoo-R1),这导致在(输出的最后几行):

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

所以说:上限是相当高的!



Answer 4:

不知道到底,但一个快速的实验结果表明,没有出现错误例如具有64kB的价值:

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


Answer 5:

我用这个非常快速和肮脏的PHP代码(如下图),修改它不同的价值观,并发现它适用于可变长度可达128K。 在那之后,无论出于何种原因,这是行不通的; 不发生异常,没有错误报告,但价值并不在子shell显示出来。

也许这是一个特定于PHP的限制吗? 也许有可能会影响它的php.ini的设置? 或者,也许有对增值经销商,一个子shell将继承的大小有限制吗? 也许有相关的内核或外壳配置设置..

无论如何,在默认情况下,在CentOS的,在PHP中通过运行putenv设置在环境中的无功极限似乎是大约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";
?>

版本信息 -

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


Answer 6:

命令行(与所有参数)加上环境变量应小于128K。



文章来源: What is the maximum size of an environment variable value?