问题的上下文:根据POSIX 规范,ARG_MAX 是函数族的命令行参数的最大长度。exec()
这让我相信这是参数的实际数量,但这显然不起作用:
$ ulimit -s
8192
$ touch {1..18000}.jpg
$ rm *.jpg
$
显然,这很好用,尽管长度超过 8192 项。根据DW 的回答,8192
应该是 kB 的大小。很明显,之前的假设是错误的。
这就是实际问题出现的地方:我如何计算实际将超过 8192 kB 限制的项目数量?换句话说,我必须执行什么样的计算来确保这种*.jpg
类型的 glob 会导致Argument list too long
错误?
请注意,这不是What defined the maximum size of single command argument的副本。我知道getconf ARG_MAX
和ulimit -s
价值观,这不是我的问题。我需要知道如何生成足够多的大小参数以超过限制。换句话说,我需要找到一种方法来获取错误,而不是避免它。
使用
getconf ARG_MAX
生成一个长列表x
并以它作为参数调用外部实用程序将生成“参数列表太长”错误:环境和字符串的长度
/bin/echo
将包含在导致错误发生的原因中,因此我们可以尝试通过减去这些来找到可能的最大数字:(我用 开始这个shell
env -i sh
,所以环境中只有PATH
变量)还是太长了。多少?
此循环退出 for
i=8
。所以有四个字节我不能立即解释(八个中的四个必须是环境变量的名称)。
PATH
这些是四个字符串的空终止符、PATH
的值和长字符串。PATH
/bin/echo
x
请注意,每个参数都是以空值结尾的,因此命令的参数越多,它们的组合长度就越短。
另外,只是为了展示一个大环境的效果:
在许多 Linux 发行版上,您可以通过运行找出 ARG_MAX 的当前值是多少
生成“参数列表太长”消息的一种简单方法是实际提供一个长参数列表;例如,在我的系统上
有效,但是
生产
有关深入讨论,请参阅Stack Overflow 上的“ Argument list too long error for rm, cp, mv commands ”。
PS 有问题的长度是存储参数和环境所需的实际内存量。它与参数的数量无关。
而不是列出系统上的所有文件,这需要永远并且在稀疏系统上不起作用,该命令
是一种更快(163 毫秒)的方式来生成错误。对我来说
ARG_MAX
是2097152
(2,097,152 大约 200 万),但命令仍然错误。如果你的 shell 没有
{start..end}
,你可以使用稍慢的(但仍然比列出文件快)如果任何一个命令都不起作用,只需增加最终值,直到它起作用,直到
bash
内存耗尽,或者直到seq
无法计数。为了更容易启动一个新的 shell(
exit
完成后)并将限制设置为较低的值(100kbytes):使用您使用的示例,可能会触发错误:
但最好使用类似
echo
. 了解内置可能不会触发错误,此命令应该可以正常工作:另请注意,字节数远远超过上面设置的限制(1.1Mbyte):
但是这个命令不起作用:
该限制由添加到 shell 环境大小的参数列表的大小(以字节为单位)设置。