Bash命令行和输入限制

时间:2013-10-14 06:52:14

标签: bash shell unix command-line-arguments

在bash(或其他shell)中是否存在某种字符限制,输入可以有多长?如果是这样,那个字符限制是什么?

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

3 个答案:

答案 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,然后烦人的行输入挂起消失了。