107

bash(或其他shell)中是否存在某种字符限制,输入可以持续多长时间?如果是这样,这个字符限制是多少?

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

4

3 回答 3

145

命令行长度的限制不是由 shell 强加的,而是由操作系统强加的。此限制通常在数百 KB 范围内。POSIX 表示此限制ARG_MAX,在符合 POSIX 的系统上,您可以使用

$ getconf ARG_MAX    # Get argument limit in bytes

例如,在 Cygwin 上这是 32000,而在我使用的不同 BSD 和 Linux 系统上,它是从 131072 到 2621440 的任何地方。

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

要回答您的具体问题,是的,可以尝试运行参数列表过长的命令。shell 将出现错误,并显示“参数列表太长”的消息。

请注意,程序的输入(在标准输入或任何其他文件描述符上读取)不受限制(仅受可用程序资源的限制)。因此,如果您的 shell 脚本将一个字符串读入一个变量,那么您将不受ARG_MAX. 该限制也不适用于 shell-builtins。

于 2013-10-14T07:30:04.690 回答
49

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

我有一台 Fedora 22 机器可供使用(意思是:带有 bash4 的 Linux)。我创建了一个目录,其中包含 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。

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

事实上,ls如果我的参数列表长 109948 个文件,或者大约 2,089,000 个字符(给予或接受),我可以创建我的目录。但是,一旦我再添加一个 18 个字符的文件名文件,就会得到一个Argument list too long错误。像宣传的那样ARG_MAX工作也是如此:exec 失败,参数列表中的字符超过ARG_MAX了 - 包括,应该注意的是环境数据。

于 2015-11-09T22:13:25.117 回答
2

有一个类似于 1024 的缓冲区限制。读取将简单地挂在粘贴或输入中间。要解决此问题,请使用 -e 选项。

http://linuxcommand.org/lc3_man_pages/readh.html

-e 使用 Readline 在交互式 shell 中获取行

将您的阅读更改为阅读 -e 并且烦人的行输入挂起消失。

于 2018-07-10T22:21:14.313 回答