似乎在展开的字符串上有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。
实际上,这不仅仅是对单个命令参数的限制,而是对整个命令行的限制。