bash -c或zsh -c对它执行的字符串有限制吗?



似乎在展开的字符串上有240个字符的限制。这个快速测试适用于短文件名,但不适用于较长的文件名。

ls | xargs -I {} zsh -c "echo '---------------------------------------------------------------------------------------------------------------------------------------------------------{}'; echo '==============================================================================={}'"

有没有办法在Mac和/或Linux上扩展这个限制?

不,bash和zsh没有这个限制。

取而代之的是man xargs(强调我的):

-I replstr

为每个输入行执行实用程序,用整行输入替换一个或多个repstr参数(如果没有指定-R标志,则替换5个)。替换完成后,结果参数将不允许超过255字节;这是通过将尽可能多的包含replstr的参数连接到构造的实用程序参数来实现的,最多255字节。255字节的限制不适用于不包含replstr的实用程序的参数,而且,不会对实用程序本身进行替换。意味着- x。

源代码更直接:

将str替换为由str组成的字符串,并在构造的字符串达到maxsize字节之前尽可能多次将match替换为replstr

因此,如果字符串已经是255+字符长,它可以替换字符串的次数为零。

这在实践中不是问题,因为您永远不会在*sh -c的参数中使用replstr,因为它会引起安全性和健壮性问题。

相反,分别传递参数并从shell命令中引用它们:

find . -print0 | xargs -0 sh -c 'for arg; do echo "Received: $arg"; done' _

这取决于操作系统,而不是shell。您可以通过

在类linux系统上找到此限制
getconf ARG_MAX

在我的平台上,这是32000。

实际上,这不仅仅是对单个命令参数的限制,而是对整个命令行的限制。

最新更新