为什么 for 循环不会引发“参数太长”错误?

为什么 for 循环不会引发“参数太长”错误?

我发现这会引发“参数太长”错误:

ls *.*

这不会提高它:

for file in *.*
do
    echo $file
done

为什么?

答案1

“参数太长”错误是E2BIGexecve如果参数的总大小(加上某些系统上的环境)太大,则系统调用。该execve调用是启动外部进程的调用,特别是加载不同的可执行文件(有一个不同的调用,fork,用于运行一个单独的进程,其代码仍然来自同一个可执行文件)。该for循环是内部 shell 构造,因此它不涉及调用execve.该命令ls *.*不是在扩展 glob 时引发错误,而是在ls调用时引发错误。

execveE2BIG命令参数的总大小大于ARG_MAX 限制。您可以使用命令查看系统上此限制的值getconf ARG_MAX。 (如果您有足够的内存,您可以超过此限制;只要不发生不相关的错误,就可以ARG_MAX保证其正常工作。)execve

答案2

我认为在第一个示例中lsbash通过fork/ execpair 系统调用执行的,在第二个示例中,所有工作都是bash.

调用exec有限制,而 的内部工作却没有(或者更好的是,有不同的限制,与可用内存量bash无关)。exec

答案3

因为在它的情况下ls它是一个参数,并且参数的数量是有限的。

在循环的情况下for,它只是一个项目列表。对此没有任何限制(据我所知)。

相关内容