Tho*_*mas 15 bash wildcards bash-expansion
bash 文件名扩展(通配)是否有最大值,如果是,它是什么?见通配符的tldp.org。
假设我想对文件子集运行命令:
grep -e bar foo*
rm -f bar*
Run Code Online (Sandbox Code Playgroud)
bash 将扩展到多少个文件是否有限制,如果有,它是什么?
我不是在寻找执行这些操作的替代方法(例如,通过使用find)。
Sté*_*las 18
bashglob可以扩展的文件数量没有限制(可用内存除外)。
但是,当这些文件作为参数传递给正在执行的命令(与 shell 内置函数或函数相反)时,您可能会execve()在某些系统上遇到系统调用的限制。在大多数系统上,该系统调用对传递给它的参数和环境的累积大小有限制,而在 Linux 上,对单个参数的大小也有单独的限制。
有关更多详细信息,请参阅:
要解决该限制,您可以使用(假设 GNUxargs或兼容):
printf '%s\0' foo* | xargs -r0 rm -f
Run Code Online (Sandbox Code Playgroud)
上面,由于printf是内置的(在bash大多数类似 Bourne 的 shell 中),我们没有达到execve()极限。并将根据需要将xargs参数列表拆分为尽可能多的rm调用以避免execve()限制。
与zsh:
autoload zargs
zargs foo* -- rm -f
Run Code Online (Sandbox Code Playgroud)
与ksh93:
command -x rm -f foo*
Run Code Online (Sandbox Code Playgroud)
您可以通过以下方式查看参数总大小的限制:
getconf ARG_MAX
Run Code Online (Sandbox Code Playgroud)
根据这个答案,这通常不是由外壳决定的,而是由底层操作系统决定的。