nob*_*be4 3 environment-variables limit command
在弄乱环境变量时,我一直看到一种奇怪的行为。我正在设置一个很长的环境变量,这会阻止启动任何命令:
( 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
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?
当程序启动时,参数列表和命令的环境被复制到内存中的相同空间中。错误信息是“参数列表太长”,但实际上确切的错误是参数列表加上环境太长。
这是作为execve
系统调用的一部分发生的。大多数(如果不是全部)unix 变体对该临时空间的大小都有限制。此限制的原因是为了避免错误或恶意程序导致内核使用该程序自身内存空间之外的大量内存。
的POSIX标准指定该存储器空间的最大尺寸必须至少ARG_MAX
,并且该最小值的那个(_POSIX_ARG_MAX
)是4096。在实践中大多数的Unix变体允许不止于此,但不10MB。您可以使用 来检查系统上的值getconf ARG_MAX
。在现代 Linux 系统上,最大值为 2MB(使用典型设置)。传统上,许多系统都有 128kB 的限制。对于单个参数的值或环境变量的定义, Linux 仍然有128kB 的限制。
如果您需要传递超过几百字节的信息,请将其传递到文件中。
归档时间: |
|
查看次数: |
2508 次 |
最近记录: |