Linux 命令行字符限制

Linux 命令行字符限制

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

$ 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)。

https://unix.stackexchange.com/questions/120642/what-defines-the-maximum-size-for-a-command-single-argument

答案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

相关内容