Bash命令行和input限制

在bash(或其他shell)中input的字符数限制是多less? 如果是的话,这个字符的限制是什么?

即是否有可能编写一个命令在bash中是太长的命令行执行? 如果没有要求的限制,是否有build议的限制?

命令行长度的限制不是由shell强加的,而是由操作系统强加的。 这个限制通常在百千字节的范围内。 POSIX表示这个限制ARG_MAX和POSIX符合性系统,你可以用它来查询

 $ getconf ARG_MAX # Get argument limit in bytes 

例如在Cygwin上,这是32000,在不同的BSD和Linux系统上,我使用的是131072到2621440。

如果您需要处理超出此限制的文件列表,则可能需要查看xargs实用程序,该实用程序会使用不超过ARG_MAX的参数子集来重复调用程序。

要回答你的具体问题,是的,有可能试图运行一个参数列表太长的命令。 shell会在“参数列表太长”的时候出错。

请注意,对程序的input (在标准input或任何其他文件描述符上读取)不受限制(仅限于可用的程序资源)。 所以如果你的shell脚本把一个string读入一个variables,你不会被ARG_MAX限制。

好吧,丹尼斯 所以我已经接受命令行长度限制作为福音很长一段时间了。 那么,如何处理一个人的假设呢? 自然地检查他们。

我有一个Fedora 22机器可以使用(意思是:使用bash4的Linux)。 我创build了一个有50万个inode(文件)的目录,每个文件长度为18个字符。 命令行长度为9,500,000个字符。 如此创build:

 seq 1 500000 | while read digit; do touch $(printf "abigfilename%06d\n" $digit); done 

我们注意到:

 $ getconf ARG_MAX 2097152 

请注意,但我可以这样做:

 $ echo * > /dev/null 

但是这个失败了:

 $ /bin/echo * > /dev/null bash: /bin/echo: Argument list too long 

我可以运行一个for循环:

 $ for f in *; do :; done 

这是另一个内置的shell。

仔细阅读ARG_MAX状态的文档, exec函数参数的最大长度 。 这意味着:不调用exec ,没有ARG_MAX限制。 所以这可以解释为什么shell ARG_MAX限制。

实际上,如果我的参数列表长度为109948个文件,或者大约2,089,000个字符(给出或取出),我可以查找我的目录。 一旦我添加了一个更多的18个字符的文件名文件,但是,我得到一个参数列表太长的错误。 因此, ARG_MAX按照公布的方式工作:在参数列表中,exec的失败次数超过了ARG_MAX字符 – 包括应该注意的是环境数据。