bash 文件名扩展(通配)是否有最大值,如果是,它是什么?

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)


Dop*_*oti 8

您可以通过以下方式查看参数总大小的限制:

getconf ARG_MAX
Run Code Online (Sandbox Code Playgroud)

根据这个答案通常不是由外壳决定的,而是由底层操作系统决定的。

  • 我认为这是总长度,而不是数量? (2认同)