我正在命令行上将变量传递给脚本。命令的字符限制是多少?例如:
$ MyScript reallyreallyreally...reallyreallyreallylongoption
谢谢。
答案1
shell/OS 施加的限制通常为十或二十万个字符。
getconf ARG_MAX
将为您提供命令的最大输入限制。在 Debian 系统上,我目前打开了一个终端,返回131072
的是128*1024
。限制会因您的环境变量而减少,如果我没记错的话,这些变量会以相同的结构由 shell 传递,尽管在大多数情况下这只会减少几百个字符。要找到此值的近似值,请运行env | wc -c
- 这表明在此机器上的此登录上当前有 325 个字符。
脚本可能允许这个全长,但其他实用程序也有可能有意或由于设计问题而施加自己的限制。长命令行上的单个参数的长度和/或文件路径的长度也可能受到人为限制。
答案2
ARG_MAX 确实限制了命令行和环境的总大小,但您还面临一个额外的限制:一个参数不能长于 MAX_ARG_STRLEN(不幸的是,它被硬编码为 131072)。
答案3
xargs
提供了另一种方法来获取有关命令行长度限制的详细信息,包括系统的理论最大值、可用最大值、POSIX 指定的最小值以及当前缓冲区大小限制。
您可以通过不提供任何输入xargs
并提供选项来实现这一点--show-limits
。手册页还建议提供--no-run-if-empty
选项(GNU 扩展)。
使用/输出示例
$ xargs --no-run-if-empty --show-limits </dev/null
Your environment variables take up 3643 bytes
POSIX upper limit on argument length (this system): 2091461
POSIX smallest allowable upper limit on argument length (all systems): 4096
Maximum length of command we could actually use: 2087818
Size of command buffer we are actually using: 131072
Maximum parallelism (--max-procs must be no greater): 2147483647
答案4
你的意思是最长的变量长度是多少?要弄清楚,你可以使用 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