我根据此链接问一个问题如何导致“参数列表太长”错误?
从线程中,如果我运行以下命令,我会看到等效的错误:
>/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 个字符),您仍然应该达到此特定限制。