bash: /usr/bin/perl: 参数列表太长

bash: /usr/bin/perl: 参数列表太长

谁能解释一下这里发生了什么:

$ 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),然后就不能再执行外部命令了。

相关内容