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


11

bash文件名扩展(globbing)是否有最大值,如果是,那是什么?见通配符的tldp.org。

假设我想对一部分文件运行命令:

grep -e bar foo*
rm -f bar*

bash可以扩展到多少文件有限制,如果可以的话,这是什么?

我不是在寻找执行这些操作的替代方法(例如通过使用find)。



2
另请参阅:什么定义了命令单个参数的最大大小?在当前的Linux系统上,单个参数的大小和总大小有不同的限制。后者取决于堆栈大小限制。
ilkkachu

Answers:


17

可用bashglob 扩展的文件数量没有限制(可用内存除外)。

但是,当这些文件作为参数传递给已执行的命令(而不是内置的shell或函数)时,则execve()在某些系统上可能会遇到系统调用的限制。在大多数系统上,该系统调用对传递给它的参数和环境的累积大小有限制,而在Linux上,对单个参数的大小也有单独的限制。

有关更多详细信息,请参见:

要解决该限制,可以使用(假设GNU xargs或兼容的):

printf '%s\0' foo* | xargs -r0 rm -f

上面,由于printf是内置的(在bash大多数Bourne外壳中),我们没有达到execve()极限。并且xargs将参数列表分为rm所需的多个调用,以避免execve()限制。

zsh

autoload zargs
zargs foo* -- rm -f

ksh93

command -x rm -f foo*

7

您可以使用以下命令查看参数总大小的限制:

getconf ARG_MAX

这通常不是由外壳程序确定的,而是由根据此答案的底层操作系统确定的。


2
我认为这是总长度,而不是数字?
ilkkachu

1
你当然是对的。我已经更新了我的答案以反映这一点。因此,参数数量的限制将是参数长度的函数。
DopeGhoti '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.