gpt4 book ai didi

bash - 为什么在传递带引号的参数时得到 "/bin/sh: Argument list too long"?

转载 作者:行者123 更新时间:2023-11-29 08:43:53 26 4
gpt4 key购买 nike

可以传递给sh -c ''的命令行可以有多长? (在 bash 和 bourne shell 中)

该限制远低于操作系统的限制(在现代 Linux 的情况下)。

例如:

$ /bin/true $(seq 1 100000)
$ /bin/sh -c "/bin/true $(seq 1 100000)"
bash: /bin/sh: Argument list too long

我该如何避免这个问题?

更新

我要注意 getconf 在这里无济于事(因为那不是系统限制):

$ seq 1 100000 | wc -c
588895
$ getconf ARG_MAX
2097152

更新 #2

现在我明白这里的重点是什么了。这不是 shell 限制,而是系统限制,而是针对每个参数的长度,而不是针对整个 arglist。

$ /bin/true $(seq 1 100000)
$ /bin/true "$(seq 1 100000)"
bash: /bin/true: Argument list too long

谢谢 CodeGnome 的解释。

最佳答案

长话短说

单个参数必须短于 MAX_ARG_STRLEN。

分析

根据 this link :

And as additional limit since 2.6.23, one argument must not be longer than MAX_ARG_STRLEN (131072). This might become relevant if you generate a long call like "sh -c 'generated with long arguments'".

这正是 OP 确定的“问题”。虽然允许的参数数量可能非常大(请参阅 getconf ARG_MAX),但当您将引用的命令传递给 /bin/sh 时,shell 会将引用的命令解释为单个命令字符串。在 OP 的示例中,正是这个单个字符串超过了 MAX_ARG_STRLEN 限制,而不是扩展参数列表的长度。

具体实现

参数限制是特定于实现的。然而,this Linux Journal article提出了几种解决这些问题的方法,包括增加系统限制。这可能不直接适用于 OP,但在一般情况下仍然有用。

做点别的

OP 的问题实际上并不是真正的问题。问题是强加一个不能解决现实世界问题的任意约束。

您可以使用循环轻松地解决这个问题。例如,对于 Bash 4:

for i in {1..100000}; do /bin/sh -c "/bin/true $i"; done

工作正常。它肯定会很慢,因为您在每次通过循环时都会生成一个进程,但它肯定会绕过您遇到的命令行限制。

描述你真正的问题

如果循环不能解决您的问题,请更新问题以描述您实际尝试使用非常长的参数列表解决的问题。探索任意行长度限制是一项学术练习,而不是 Stack Overflow 的主题。

关于bash - 为什么在传递带引号的参数时得到 "/bin/sh: Argument list too long"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11475221/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com