同一命令的混合结果(与 ARG_MAX 相关)

同一命令的混合结果(与 ARG_MAX 相关)

我根据此链接问一个问题如何导致“参数列表太长”错误?

从线程中,如果我运行以下命令,我会看到等效的错误:

>/bin/echo `perl -e 'print "x" x 1000000'`
/bin/echo: Argument list too long.

但是,如果我使用echo而不是/bin/echo,它没有错误,即使我超出了 ARG_MAX

>echo `perl -e 'print "x" x 100000000'`
xxxxxxxxxxx...

这是我的环境

>which echo; getconf ARG_MAX
/bin/echo
2097152

我正在使用 tcsh。

答案1

区别在于它echo是 shell 的内置文件,而/bin/echo它是外部可执行文件。

ARG_MAX 的限制在于执行外部二进制文件的内核系统调用(execve(2).)

在 shell 中执行内置函数时,系统不会施加此类限制,只有来自 shell 本身的限制,并且大多数 shell 除了可用于存储参数的内存之外不会施加限制。

顺便说一下,在这种情况下,当您执行 external 时/bin/echo,您达到的实际限制是 ARG_MAX_STRLEN,这是 a 的最大长度单身的参数,并且在 Linux on Intel 上硬编码为 131,072 字节。看这个答案更多细节。 ARG_MAX 仍然是所有参数(加上环境变量等)的限制,但每个单个参数都受到 ARG_MAX_STRLEN 的限制。因此,即使您缩短 Perl 表达式以生成更短的 srring(例如 132,000 个字符),您仍然应该达到此特定限制。

相关内容