谁能解释一下这里发生了什么:
$ export a
$ a=`perl -e 'print "z"x1000000'`
$ a=`perl -e 'print "z"x1000000'`
bash: /usr/bin/perl: Argument list too long
$ a=`perl -e 'print "z"x1000000'`
$ a=`perl -e 'print "z"x1000000'`
bash: /usr/bin/perl: Argument list too long
(perl one liner 生成一个包含 1000000 个 zs 的字符串)。为什么每次运行的命令行都太长?
$ bash --version
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
编辑
看来失败的运行会重置 $a。限制似乎是131070。低于这个值就没有错误。
答案1
这是对传递给的参数和环境变量的大小的限制执行。
- POSIX 通过 指定它
ARG_MAX
。 - Linux 内核 2.6.23 之前的版本,限制为 32 页(MAX_ARG_PAGES 个)。对于 4 kB 页面大小,限制为 128kB。
- Linux 内核 2.6.23 及更高版本,限制为允许堆栈大小的 1/4。
请注意,还有一个限制传递给 execve 的字符串的最大长度和数量。它是在 Linux 源代码中硬编码的,并且无论允许的堆栈大小如何都会应用它。
你可以看到人2执行更多细节。
第二次运行时,Perl 进程不会启动,因此命令替换`perl …`
会生成空输出并a
设置为空值,从而将环境缩小回较小的大小。然后第三个命令成功并将环境设置为接近大小限制,依此类推。
为了更清楚,你可以尝试export a; a=$(yes | head -c128k)
,然后就不能再执行外部命令了。