在bash(或其他shell)中是否存在某种字符限制,输入可以有多长?如果是这样,那个字符限制是什么?
即。是否有可能在bash中编写一个命令行执行时间过长的命令? 如果没有要求的限制,是否有建议的限制?
答案 0 :(得分:106)
命令行长度的限制不是由shell强加的,而是由操作系统强加的。此限制通常在100千字节的范围内。 POSIX表示此限制ARG_MAX
,在POSIX符合系统上,您可以使用
$ getconf ARG_MAX # Get argument limit in bytes
E.g。在Cygwin上这是32000,在不同的BSD和Linux系统上,我使用的是131072到2621440.
如果您需要处理超出此限制的文件列表,您可能需要查看xargs
实用程序,该实用程序使用不超过ARG_MAX
的参数子集重复调用程序。
要回答您的具体问题,是的,可以尝试运行一个参数列表太长的命令。 shell会在“参数列表太长”的情况下出现错误。
请注意,程序的输入(在stdin或任何其他文件描述符上读取)不受限(仅限可用的程序资源)。因此,如果shell脚本将字符串读入变量,则不受ARG_MAX
的限制。该限制也不适用于shell-builtins。
答案 1 :(得分:38)
好的,Denizens。所以我已经接受命令行长度限制作为福音很长一段时间了。那么,如何处理一个人的假设呢?自然地检查它们。
我有一台Fedora 22机器可供我使用(意思是:Linux使用bash4)。我创建了一个目录,其中包含500,000个inode(文件),每个长度为18个字符。命令行长度为9,500,000个字符。因此创建:
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。
仔细阅读documentation for ARG_MAX
个状态,执行函数的最大参数长度。这意味着:在不调用exec
的情况下,没有ARG_MAX
限制。因此,它可以解释为什么shell内置函数不受ARG_MAX
的限制。
事实上,如果我的参数列表是109948个文件长度,或者大约2,089,000个字符(给予或接受),我可以ls
我的目录。但是,一旦我添加了一个18个字符的文件名文件,那么我得到参数列表太长错误。所以ARG_MAX
正如所宣传的那样工作:exec在参数列表中失败超过ARG_MAX
个字符 - 包括应该注意的环境数据。
答案 2 :(得分:-2)
有一个类似1024的缓冲区限制。读取将只是挂在中间粘贴或输入。要解决此问题,请使用-e选项。
http://linuxcommand.org/lc3_man_pages/readh.html
-e使用Readline在交互式外壳中获取行
将您的读更改为-e,然后烦人的行输入挂起消失了。