可以传递到的命令行有多长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
我该如何规避这个问题?
Update
我想指出的是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 的解释。
TL;DR
单个参数必须短于 MAX_ARG_STRLEN。
Analysis
根据这个链接:
作为自 2.6.23 起的附加限制,一个参数的长度不得超过 MAX_ARG_STRLEN (131072)。如果您生成像“sh -c '使用长参数生成'”这样的长调用,这可能会变得相关。
这正是OP指出的“问题”。虽然允许的参数数量可能非常大(请参阅getconf ARG_MAX
),当您将带引号的命令传递给/bin/shshell 将引用的命令解释为单个字符串。在OP的示例中,正是这个单个字符串超出了 MAX_ARG_STRLEN 限制,而不是扩展参数列表的长度。
具体实施
参数限制是特定于实现的。然而,这篇 Linux 期刊文章提出了几种解决这些问题的方法,包括增加系统限制。这可能并不直接适用于 OP,但它在一般情况下仍然有用。
做点别的事
OP的问题实际上并不是一个真正的问题。问题在于施加任意约束,但无法解决现实世界的问题。
您可以通过使用循环轻松解决这个问题。例如,对于 Bash 4:
for i in {1..100000}; do /bin/sh -c "/bin/true $i"; done
工作得很好。它肯定会很慢,因为您在每次循环时都会生成一个进程,但它肯定会绕过您遇到的命令行限制。
描述您的真正问题
如果循环不能解决您的问题,请更新问题以描述您实际尝试使用很长的参数列表解决的问题。探索任意行长度限制是一项学术活动,而不是 Stack Overflow 的主题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)