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

新手上路,请多包涵

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

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

原文由 Gio 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.9k
2 个回答

我认为 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;
}

原文由 sigjuice 发布,翻译遵循 CC BY-SA 4.0 许可协议

好吧,我的盒子至少有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 中获取实际信息。如果它 @ 开头,它使用环境变量本身的值。


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

原文由 paxdiablo 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏