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
字符 – 包括应该注意的是环境数据。