Linux命令行字符限制


27

我在命令行上将变量传递给脚本。命令的字符限制是什么?例如:

$ MyScript reallyreallyreally...reallyreallyreallylongoption

谢谢。


1
我不明白这问题。您对字符数限制感兴趣吗?
krissi

您需要更清楚地陈述您的问题,否则它将被关闭。
ThatGraemeGuy 2010年

Answers:


27

Shell / OS施加的限制通常很长-通常为一或二十万个字符。

getconf ARG_MAX将为您提供命令的最大输入限制。在Debian系统上,我目前有一个打开的终端,该终端返回131072,即128 * 1024。环境变量降低了限制,就好像我的内存正确地为我服务时,这些变量由外壳以相同的结构传递,尽管在大多数情况下,这只会占用几百个字符。要找到此值的近似值,请env | wc -c在此计算机上的此登录名上建议当前当前为325个字符。

脚本很可能会允许这样的全长,但是其他实用程序不太可能会故意或通过设计问题强加自己的限制。对于长命令行上的单个参数可以有多长时间,和/或文件路径可以有多长时间,也可能存在人为限制。


2
在我的系统上,getconf ARG_MAX给出2097152,但是我可以通过的最大arg长度仍然是131071(并且我不必减去环境的大小)。
暂停,直到另行通知。

1
还请记住,在处理庞大的论点列表时xargs,甚至find -exec是您的朋友。
coredump

@Dennis:getconf我认为返回的值是内核级别。也许bash通过其设计/配置设置了下限?另外,我对此的了解来自一段时间以前,所以可能是最近发生了一些变化,尽管除了新的实验壳之外,我希望这不是一个可以看到很多变化的领域。
David Spillett

我得到同样的结果kshzshdashfish和Bash 3正如我在猛砸4.做的错误消息,从fish可能是信息:“鱼,争吵和环境列出的总大小(130KB)超过2.0MB的操作系统限制”。但是,set | wc -c是306317和env | wc -c2507并没有说明差异。我不知道还有什么。
暂停,直到另行通知。


1

您是说最长的可变长度是多少?为了弄清楚,您可以使用perl的“ x”来创建一个很长的变量名:

 VAR=`perl -e 'print "a"x131071'` ; bash a.sh $VAR

在我的系统131071上工作:

并且变量在131072上打印,它太大:

VAR=`perl -e 'print "a"x131072'` ; bash a.sh $VAR
bash: /bin/bash: Argument list too long

2
实际上,这是一个非常长的变量
暂停,直到另行通知。

3
另外,您不必使用perl和脚本:/bin/echo "$(printf "%*s" 131071 ".")">/dev/null
已暂停,直到另行通知。

@DennisWilliamson但是printf '%s\n' "$(printf '%*s' 131072 .)" >/dev/null有效。
jarno

那是因为它printf是内置的shell,所以bash不需要exec()为生成另一个进程而做一个。ARG_MAX仅关系到的参数列表的长度exec的功能(exec()execl()execlp()execvp()execvpe(),等等)。
Vicente Olivert Riera
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.