Linux环境变量值的最大大小是多少?

Linux环境变量值的最大大小是多少?,linux,shell,environment-variables,Linux,Shell,Environment Variables,Linux上环境变量中可以存储的数据量是否有限制?如果有,限制是什么 对于Windows,我发现了以下内容: Windows XP或更高版本:8191个字符 Windows 2000/NT 4.0:2047个字符我认为Linux上没有每个环境变量的限制。所有环境变量的总大小限制在execve()时间。有关更多信息,请参阅“参数和环境的大小限制” 进程可以使用setenv()或putenv()将环境扩展到exec分配的初始空间之外 下面是一个快速而肮脏的程序,它创建了一个256 MB的环境变量 #

Linux上环境变量中可以存储的数据量是否有限制?如果有,限制是什么

对于Windows,我发现了以下内容: Windows XP或更高版本:8191个字符
Windows 2000/NT 4.0:2047个字符

我认为Linux上没有每个环境变量的限制。所有环境变量的总大小限制在
execve()
时间。有关更多信息,请参阅“参数和环境的大小限制”

进程可以使用
setenv()
putenv()
将环境扩展到exec分配的初始空间之外

下面是一个快速而肮脏的程序,它创建了一个256 MB的环境变量

#包括
#包括
#包括
#包括
内部主(空)
{

size\u t size=1不知道确切情况,但快速实验表明不会发生错误,例如64kB的值:

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

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

好吧,我的盒子上至少有4M。在那一点上,我感到厌烦和迷茫。希望在我周一回来工作之前,终端输出能完成:-)

如果您担心4M可能不足以满足您的环境变量,您可能需要重新思考您的工作方式

也许将信息放入一个文件中,然后使用一个环境变量引用该文件是一个更好的主意。我见过这样的情况:如果变量的形式是
@/path/to/any/fspec
,它将从文件
path/to/any/fspec
获取实际信息。如果它不是以
@
开头,它将使用e环境变量本身的值



有趣的是,设置了所有这些变量后,每个命令都开始抱怨参数列表太长,因此,即使它允许您进行设置,但在您完成后,它可能无法启动程序(因为它必须将环境传递给这些程序)。

我使用了这段非常快速且肮脏的php代码(如下所示),针对不同的值对其进行修改,发现它适用于128k以下的可变长度。此后,无论出于何种原因,它都不起作用;不会引发异常,也不会报告错误,但该值不会显示在子shell中

可能这是一个特定于php的限制?可能有可能影响它的php.ini设置?或者子shell将继承的变量大小有限制?可能有相关的内核或shell配置设置

无论如何,默认情况下,在CentOS中,通过php中的putenv在环境中设置var的限制似乎是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)
[root@localhostscratch]#php--版本
PHP 5.2.6(cli)(构建日期:2008年12月2日16:32:08)
[root@localhost刮伤]#解除-a
Linux localhost.localdomain 2.6.18-128.2.1.el5#1 SMP星期二7月14日06:36:37美国东部夏令时2009年x86_64 x86_64 x86_64 GNU/Linux
[root@localhost刮伤]#cat/etc/redhat释放
CentOS 5.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)中,这将导致(输出的最后一行):


因此:限制非常高!

这里有两个有用的命令:

  • getconf-a | grep ARG_MAX

  • true | xargs--显示限制


我希望您使用的是脚本,而不是手动键入所有内容!不,这就是“无聊”的原因Vi模式的命令行编辑使它变得简单了一点,但我认为在我达到4M标记之前它可能会失败。这是生活。但是?可能吗too@LưuVĩnhPhúc:因为程序有限制。它们可能是任意的限制,也可能是基于可用资源的限制,但这些限制是存在的。很可能大卫克认为他的shell不会(错误-)由应该更清楚的疯子使用:-)+1表示execve()信息。实际上,您可以添加多达(至少)8M的环境变量,但exec()调用将不起作用。这在bash中表现为“参数列表太长”当您尝试运行命令时。还要注意,POSIX要求ARG_MAX至少为4096。讨论使用
xargs--show limits
获取更多信息。我也看到了每个ARG字符串的限制-“此外,每个字符串的限制为32页(内核常量MAX_ARG_STRLEN)”windows上的实际限制是31767。您了解了
set
命令,该命令的命令行限制为8191个字符。尽管.8191不是随机的,但仍然是随机限制。它是2^13-1.AWS Lambda:[环境变量]集的总大小不超过4KB()@BarnabyDawson也许Christopher的意思是,它是任意的?18446744071562068096字节大约是15 EB.:)这看起来像是512MiB的一个大跳跃。@Marcus:是的……我想不知怎么回事,1Gb,即1073741824字节,即2^30字节溢出了。18446744071562068096错误中的字节数非常接近2^64即18446744073709551616我的C/gdb技能有限,但我认为问题出在bash源文件subst.C中。函数sub_append_string(第726行)使用一个名为n的有符号int变量来计算新大小。新大小(2^31)适合,但有一个对齐计算:
n=(n+DEFAULT_ARRAY_size)-(n%默认数组大小);
我怀疑部分:
(n+默认数组大小)
overflows。这一切都很好,但我们当然超出了任何合理的限制。~100个变量中哪一个相关?它们记录在哪里?@ingomueller.net:为了避免无用的结果,第一个命令可以限制为
getconf-a | grep ARG_MAX
a="1"
while true
do
    a=$a$a
    echo "$(date) $(numfmt --to=iec-i --suffix=B --padding=7 ${#a})" 
done
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