设置很长的环境变量会破坏很多命令

设置很长的环境变量会破坏很多命令

当弄乱环境变量时,我发现了一种奇怪的行为。我正在设置一个很长的环境变量,这会阻止启动任何命令:

( Ubuntu 14.04.5 LTS (GNU/Linux 4.4.0-66-generic x86_64) )

$ export A=$(python -c "print 'a'*10000000")
$ env
-bash: /usr/bin/env: Argument list too long
$ ls
-bash: /bin/ls: Argument list too long
$ cat .bashrc
-bash: /bin/cat: Argument list too long
$ id
-bash: /usr/bin/id: Argument list too long

这里发生了什么事?

答案1

当程序启动时,参数列表和命令环境被复制到内存中的同一空间。错误信息是“参数列表太长”,但实际上确切的错误是参数列表加上环境太长。

这是作为execve系统调用。大多数(如果不是全部)Unix 变体对此临时空间的大小都有限制。进行此限制的原因是为了避免有错误或恶意的程序导致内核使用该程序自己的内存空间之外的大量内存。

POSIX标准指定该内存空间的最大大小必须至少为ARG_MAX,并且最小值其中 ( _POSIX_ARG_MAX) 为 4096。实际上,大多数 Unix 变体允许超过该值,但不允许 10MB。您可以使用 检查系统上的值getconf ARG_MAX。在现代 Linux 系统上,最大值为 2MB(使用典型设置)。传统上,许多系统都有 128kB 的限制。 Linux也还有一个单个参数的值或环境变量的定义的 128kB 限制

如果需要传递超过几百字节的信息,请将其传递到文件中。

相关内容