Bash 命令行和输入限制

Bash (或其他 shell)中是否对输入的长度施加了某种字符限制?如果是这样,那么字符限制是多少?

也就是说,有没有可能在 bash 中编写的命令太长,以至于命令行无法执行? 如果没有规定的限制,是否有建议的限制?

145788 次浏览

命令行的长度限制不是由 shell 决定的,而是由操作系统决定的。这个限制通常在10KB 的范围内。POSIX 表示这个限制 ARG_MAX,在符合 POSIX 的系统上可以查询它

$ getconf ARG_MAX    # Get argument limit in bytes

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

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

要回答您的具体问题,是的,有可能尝试运行参数列表过长的命令。Shell 将错误地显示“参数列表太长”的消息。

请注意,程序的 input(在 stdin 或任何其他文件描述符上读取)受到 not的限制(仅受可用程序资源的限制)。因此,如果您的 shell 脚本将字符串读入变量,则不受 ARG_MAX的限制。该限制也不适用于 shell 内置程序。

好了,居民们。因此,我已经接受命令行长度限制作为福音相当一段时间了。那么,如何处理一个人的假设呢?当然,检查一下。

我有一台 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

Note however I can do this:

$ echo * > /dev/null

但这种做法失败了:

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

我可以运行一个 for 循环:

$ for f in *; do :; done

这是另一个内置的壳。

仔细阅读 ARG_MAX的文件状态,Maximum length of argument to the exec functions。这意味着: 没有调用 exec,就没有 ARG_MAX限制。因此,它可以解释为什么 shell 内建不受 ARG_MAX的限制。

实际上,如果我的参数列表是109948个文件,或者大约2,089,000个字符(误差不大) ,我可以使用 ls我的目录。但是,一旦我再添加一个18个字符的文件名文件,就会得到一个 参数列表太长错误。因此,ARG_MAX正在按照广告中所说的那样工作: exec 在参数列表中出现了超过 ARG_MAX字符的错误——应该注意的是,其中包括环境数据。

有一个类似1024的缓冲区限制。读操作只是简单地挂起粘贴或输入。要解决此问题,请使用-e 选项。

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

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

将您的读取更改为 read-e,烦人的行输入挂起消失。

在过去,tcsh对每个命令行限制为1024个字符,这使得如果 $PATH非常长就很困难。我被迫重新构建了 tcsh 的私有版本,增加了缓冲区大小,以允许用户拥有较长的 $PATH设置。那是20年前的事了。这就是我放弃使用 tcsh,转而使用 zsh 的原因,因为 zsh 没有这个限制。现在我只使用普通的 bash,因为它已经足够好了。