我发现这会引发“参数太长”错误:
ls *.*
这不会提高它:
for file in *.*
do
echo $file
done
为什么?
答案1
“参数太长”错误是E2BIG
由execve
如果参数的总大小(加上某些系统上的环境)太大,则系统调用。该execve
调用是启动外部进程的调用,特别是加载不同的可执行文件(有一个不同的调用,fork
,用于运行一个单独的进程,其代码仍然来自同一个可执行文件)。该for
循环是内部 shell 构造,因此它不涉及调用execve
.该命令ls *.*
不是在扩展 glob 时引发错误,而是在ls
调用时引发错误。
execve
当E2BIG
命令参数的总大小大于ARG_MAX
限制。您可以使用命令查看系统上此限制的值getconf ARG_MAX
。 (如果您有足够的内存,您可以超过此限制;只要不发生不相关的错误,就可以ARG_MAX
保证其正常工作。)execve
答案2
我认为在第一个示例中ls
是bash
通过fork
/ exec
pair 系统调用执行的,在第二个示例中,所有工作都是bash
.
调用exec
有限制,而 的内部工作却没有(或者更好的是,有不同的限制,与可用内存量bash
无关)。exec
答案3
因为在它的情况下ls
它是一个参数,并且参数的数量是有限的。
在循环的情况下for
,它只是一个项目列表。对此没有任何限制(据我所知)。