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

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

bash 文件名扩展(通配符)是否有最大限制?如果有,它是什么?看通配在 tldp.org 上。

假设我想对文件子集运行命令:

grep -e bar foo*
rm -f bar*

bash 扩展的文件数量是否有限制?如果有的话,限制是多少?

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

答案1

glob 可以扩展的文件数量没有限制(可用内存除外)bash

但是,当这些文件作为参数传递给命令时,被处决(与 shell 内置函数或函数相反),那么您可能会execve()在某些系统上遇到系统调用的限制。在大多数系统上,该系统调用对传递给它的参数和环境的累积大小有限制,并且在 Linux 上对单个参数的大小也有单独的限制。

欲了解更多详情,请参阅:

要解决该限制,您可以使用(假设 GNUxargs或兼容):

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

上面,因为printf是内置的(在bash大多数类似 Bourne 的 shell 中),所以我们没有达到极限execve()。并将根据需要xargs将参数列表拆分为尽可能多的rm调用以避免execve()限制。

zsh

autoload zargs
zargs foo* -- rm -f

ksh93

command -x rm -f foo*

答案2

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

getconf ARG_MAX

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

相关内容